Android 6.0 运行时权限如何处理

Android 6.0 在我们原有的 AndroidManifest.xml 声明权限的基础上,又新增了运行时权限动态检测, Android6.0 系统默认为 targetSdkVersion 小于 23 的应用默认授予了所申请的所有权限,因此在Android 开发 中,你需要注意了,如果你以前的 APP 设置的 targetSdkVersion 低于 23 ,在运行时也不会崩溃,但这也只是一个临时的救急策略,用户还是可以在设置中取消授予的权限。

声明目标 SDK 版本
我们需要在 build.gradle 中声明 targetSdkVersion 23
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"

defaultConfig {
     applicationId "com.yourcomany.app
     minSdkVersion 18
     targetSdkVersion 23
     versionCode 1
     versionName "1.0"
}
buildTypes { release {minifyEnabled false proguardFiles
getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } }

检查并申请权限
我们需要在用到权限的地方,每次都检查是否 APP 已经拥有权限,比如我们有一个下载功能,需要写 SD 卡的权限,我们在写入之前检查是否有 WRITE_EXTERNAL_STORAGE 权限,没有则申请权限


      If (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
              != PackageManager.PERMISSION_GRANTED) {
          // 申请 WRITE_EXTERNAL_STORAGE 权限
          ActivityCompat.requestPermissions(this, new
String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
                  WRITE_EXTERNAL_STORAGE_REQUEST_CODE);
      }
请求权限后,系统会弹出请求权限的 Dialog

用户选择允许或需要后,会回调 onRequestPermissionsResult 方法 该方法类似于 onActivityResult
  @Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      doNext(requestCode,grantResults);
  }
我们接着需要根据 requestCode grantResults( 授权结果 ) 做相应的后续处理
private void doNext(int requestCode, int[] grantResults) {
      if (requestCode == WRITE_EXTERNAL_STORAGE_REQUEST_CODE) {
          if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
              // Permission Granted
          } else {
              // Permission Denied
          }
      }
  }
Fragment 中运行时权限的特殊处理
Fragment 中申请权限,不要使用 ActivityCompat.requestPermissions,  直接使用 Fragment requestPermissions 方法,否则会回调到 Activity 的  onRequestPermissionsResult
如果在 Fragment 中嵌套 Fragment ,在子 Fragment 中使用 requestPermissions 方 法, onRequestPermissionsResult 不会回调回来,建议使用  getParentFragment().requestPermissions 方法,这个方法会回调到父 Fragment 中的 onRequestPermissionsResult ,加入以下代码可以把回调透传到子 Fragment
  @Override
  public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
      super.onRequestPermissionsResult(requestCode, permissions, grantResults);
      List<Fragment> fragments = getChildFragmentManager().getFragments();
      if (fragments != null) {
          for (Fragment fragment : fragments) {
              if (fragment != null) {
                  fragment.onRequestPermissionsResult(requestCode,permissions,grantResults);
              }
          }
      }
  }
相关开源项目
PermissionsDispatcher
使用标注的方式,动态生成类处理运行时权限,目前还不支持嵌套 Fragment
RxPermissions
基于 RxJava 的运行时权限检测框架
Grant
简化运行时权限的处理,比较灵活
android-RuntimePermissions
Google 官方的例子
附录
以下权限只需要在 AndroidManifest.xml 中声明即可使用
android.permission.ACCESS_LOCATION_EXTRA_COMMANDS
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_NOTIFICATION_POLICY
android.permission.ACCESS_WIFI_STATE
android.permission.ACCESS_WIMAX_STATE
android.permission.BLUETOOTH
android.permission.BLUETOOTH_ADMIN
android.permission.BROADCAST_STICKY
android.permission.CHANGE_NETWORK_STATE
android.permission.CHANGE_WIFI_MULTICAST_STATE
android.permission.CHANGE_WIFI_STATE
android.permission.CHANGE_WIMAX_STATE
android.permission.DISABLE_KEYGUARD
android.permission.EXPAND_STATUS_BAR
android.permission.FLASHLIGHT
android.permission.GET_ACCOUNTS
android.permission.GET_PACKAGE_SIZE
android.permission.INTERNET
android.permission.KILL_BACKGROUND_PROCESSES
android.permission.MODIFY_AUDIO_SETTINGS
android.permission.NFC
android.permission.READ_SYNC_SETTINGS
android.permission.READ_SYNC_STATS
android.permission.RECEIVE_BOOT_COMPLETED
android.permission.REORDER_TASKS
android.permission.REQUEST_INSTALL_PACKAGES
android.permission.SET_TIME_ZONE
android.permission.SET_WALLPAPER
android.permission.SET_WALLPAPER_HINTS
android.permission.SUBSCRIBED_FEEDS_READ
android.permission.TRANSMIT_IR
android.permission.USE_FINGERPRINT
android.permission.VIBRATE
android.permission.WAKE_LOCK
android.permission.WRITE_SYNC_SETTINGS
com.android.alarm.permission.SET_ALARM
com.android.launcher.permission.INSTALL_SHORTCUT
com.android.launcher.permission.UNINSTALL_SHORTCUT
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值