Android 6.0 运行时权限处理

来源:互联网 发布:java入门教程视频 编辑:程序博客网 时间:2024/05/17 01:57

运行时权限介绍

Android 6.0在我们原有的AndroidManifest.xml声明权限的基础上,
又新增了运行时权限动态检测,以下权限都需要在运行时判断:

身体传感器日历摄像头通讯录地理位置麦克风电话短信存储空间

运行时权限处理

Android6.0系统默认为targetSdkVersion小于23的应用默认授予了所申请的所有权限,
所以如果你以前的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_COMMANDSandroid.permission.ACCESS_NETWORK_STATEandroid.permission.ACCESS_NOTIFICATION_POLICYandroid.permission.ACCESS_WIFI_STATEandroid.permission.ACCESS_WIMAX_STATEandroid.permission.BLUETOOTHandroid.permission.BLUETOOTH_ADMINandroid.permission.BROADCAST_STICKYandroid.permission.CHANGE_NETWORK_STATEandroid.permission.CHANGE_WIFI_MULTICAST_STATEandroid.permission.CHANGE_WIFI_STATEandroid.permission.CHANGE_WIMAX_STATEandroid.permission.DISABLE_KEYGUARDandroid.permission.EXPAND_STATUS_BARandroid.permission.FLASHLIGHTandroid.permission.GET_ACCOUNTSandroid.permission.GET_PACKAGE_SIZEandroid.permission.INTERNETandroid.permission.KILL_BACKGROUND_PROCESSESandroid.permission.MODIFY_AUDIO_SETTINGSandroid.permission.NFCandroid.permission.READ_SYNC_SETTINGSandroid.permission.READ_SYNC_STATSandroid.permission.RECEIVE_BOOT_COMPLETEDandroid.permission.REORDER_TASKSandroid.permission.REQUEST_INSTALL_PACKAGESandroid.permission.SET_TIME_ZONEandroid.permission.SET_WALLPAPERandroid.permission.SET_WALLPAPER_HINTSandroid.permission.SUBSCRIBED_FEEDS_READandroid.permission.TRANSMIT_IRandroid.permission.USE_FINGERPRINTandroid.permission.VIBRATEandroid.permission.WAKE_LOCKandroid.permission.WRITE_SYNC_SETTINGScom.android.alarm.permission.SET_ALARMcom.android.launcher.permission.INSTALL_SHORTCUTcom.android.launcher.permission.UNINSTALL_SHORTCUT
来自:http://www.jianshu.com/p/b4a8b3d4f587
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子成绩考差了怎么办 孩子静不下心学习怎么办 孩子考试时总是粗心马虎怎么办 小学二年级学生厌学怎么办 三岁宝宝肚脐痛怎么办 做题速度太慢怎么办 孩子做题不动脑不会转弯怎么办? 孩子做题总是马虎怎么办 孩子做题总是眼高手低怎么办 小孩说幼儿园老师不喜欢他怎么办 初中学生了不喜欢读书怎么办 小孩吐怎么办给揉哪里 8岁了不爱写字怎么办呢 8岁了不会写字怎么办呢 高考做题时犯各种粗心错误怎么办 孩子做题不认真读题怎么办 孩子不爱学习怎么办有什么办法 小孩字写的不好怎么办 孩子的字写得丑怎么办 一年级孩子生字默不出来怎么办 5岁宝宝不爱写字怎么办 三年级小孩不自觉做作业怎么办 一年级的孩子不爱写字怎么办 一年级孩子不爱写作业怎么办 一年级的小孩不爱写字怎么办 小孩儿写字做作业磨蹭怎么办 孩子不学习成绩差不写作业怎么办 儿童4岁不会写字怎么办 小孩读中班还不会写字怎么办 幼儿园中班孩子不写字怎么办 小孩吃多了呕吐怎么办 一岁宝宝老便秘怎么办 4周岁半幼儿便秘怎么办 没胃口不能吃辣怎么办 九个月宝宝缺锌怎么办 宝宝4 5天不吃饭怎么办 16个月宝宝不肯吃饭怎么办 儿童不吃饭很瘦怎么办 小孩吃饭吃的少怎么办 宝宝突然晚上不睡觉怎么办 l岁宝宝吃多了怎么办