Android6.0运行时权限处理
2015-11-09 11:30:35 | 来源:玩转帮会 | 投稿:佚名 | 编辑:小柯

原标题:Android6.0运行时权限处理

运行时权限介绍

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

Android 6.0 运行时权限处理 - 技术文摘 | 玩赚乐

  • 用户选择允许或需要后,会回调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

tags:

上一篇  下一篇

相关:

吃寄生虫可以治病?

不干不净,吃了没病,据说很有道理?孩子脏一点养,更健康,据说很靠谱?热心肠先生今天开始的两篇文章,或

Linux中的静态库和动态库简介及生成过程示例

在实际的软件开发项目中,不是每一行代码都需要我们亲自写。在我们的软件产品中,有一些代码(尤其是函数)的

5个iOS和Android最佳的开源自动化工具

本文由玩赚乐(www.banghui.org)– 小峰原创翻译,转载请看清文末的转载要求,欢迎加入技术翻译小组!自动化

纯CSS创建各种不同的图形形状

本文由玩赚乐(www.banghui.org)– 小峰原创翻译,转载请看清文末的转载要求,欢迎加入技术翻译小组!介绍今

伦敦这个店提供咖啡,还提供全球300种高颜值杂志

Monocle又开新的咖啡店了!今年10月,新的咖啡厅在伦敦的Paddington车站开业,我们知道这个不是很新的消息

烟台这个房子,你能看出它之前是座烂尾办公楼吗?

空置已久的烂尾楼如何改造?这或许是中国很多城市都在寻找答案的一个问题。在上一波建筑热潮过去后,这些烂

今日应用:谁说跑酷很无聊,这款可以敲击手机背面玩

Fast like a Fox 是一款跑酷游戏,跟常见的跑酷游戏不同的是,玩家需要用一只手在手机背部不断敲击来获得速

这家酒店凝聚了50多个设计师的想法,效果相当不错

澳大利亚堪培拉有个精品酒店,叫 Hotel Hotel (是的,的确是这个名字)。它有一个非常惊艳的酒店大堂,甚

P2P规模破万亿但如履薄冰

腾讯科技 王潘 11月9日报道互联网金融和O2O无疑是最近两年国内最为火热的两大互联网创业方向,然而,2015年

这里是广告·改写命运字幕组|感谢有你

这可能是最短的一期“这里是广告”,因为我们想说的其实只有一句话:感谢。这也可能是最复杂的一句“感谢”

站长推荐: