Android运行时权限机制和动态申请权限

运行时权限机制是 Android 6.0(M) 的新特性,我们在安装app的时候将不会授予权限,而是在运行时一个一个询问用户来授予权限。

1、Android 6.0 之前版本的应对之策

Android 6.0 系统默认为targetSdkVersion小于23的应用授予了所申请的所有权限,所以如果你以前 App设置的targetSdkVersion低于23,在运行时也不会崩溃。

2、Normal Permisson 与 Dangerous Permission

Google 将权限分为两类:一类是Normal Permission,这类权限一般不涉及用户隐私,是无须用户进行授权的,比如手机振动、访问网络等,这些权限只需要在AndroidManifest.xml中简单声明就好,安装时就授权,无须每次使用时都检查权限,而且用户不能取消以上授权;另一类是 Danger Permission,一般会涉及用户隐私,需要用户进行授权,比如读取sdcard、访问通信录等。

Normal Permission


屏幕快照 2018-09-12 上午11.14.09.png
屏幕快照 2018-09-12 上午11.14.22.png

Dangerous Permission则是以分组的形式给出的


屏幕快照 2018-09-12 上午11.15.38.png

同一组的任何一个权限被授权了,其他权限也自动被授权。此外,对于申请时弹出的提示框上面的文本说明也是对整个权限组的说明,而不是单个权限的说明。

3、运行时申请权限

第一、在AndroidManifest声明所需的权限

第二、使用相应的API方法动态申请

(1)使用系统提供的API

动态权限的核心工作流程:checkSelfPermission(检查是否已被授予)—>requestPermissions(申请权限)—>onRequestPermissionsResult(自动回调)—>shouldShowRequestPermissionRationale。

(2)使用第三方开源框架

目前用得比较多的动态权限第三方库PermissionDispatcher
https://github.com/permissions-dispatcher/PermissionsDispatcher,核心也是依然离不开系统的API,PermissionsDispatcher采用注解,主要就是在编译时生成代理类(代理类名称格式为XxxxPermissionsDispatcher,其中Xxxx为@RuntimePermissions标注的Activity或Fragment类名称),在Activity/Fragment中通过代理类去完成权限的检查工作,并且把系统的权限处理回调回传到代理类内部,进而完成出发内部的回调,在效率上和官方差不多,唯一的区别在于调用的形式:由于采用代理的形式,不是直接调用系统API的checkSelfPermission来检查权限,取而代之的是代理类里的XxxxWithCheck的方法(其中Xxx代表被@NeedsPermission标注的方法名);处理权限申请的结果依然是在系统的onRequestPermissionsResult方法内,但是我们必须把回调结果回传到代理类,所以还必须用代理类调用他对应的onRequestPermissionsResult方法

屏幕快照 2018-09-12 上午11.55.34.png

  • 在 Module 下 build.gradle 引入依赖


    屏幕快照 2018-09-12 上午11.57.29.png
  • 在需要动态权限的Activity或Fragment加上注解RuntimePermissions

  • 在涉及到动态权限的方法加上注解@NeedsPermission

  • 在需要申请动态权限的方法处,使用代理类的XxxWithCheck方法开启动态权限申请的第一步

  • 重写权限处理回调方法onRequestPermissionsResult,并且通过回传到代理类内部的onRequestPermissionsResult方法

  • 然后根据各自的业务需求,使用@OnShowRationale、@OnPermissionDenied、@OnNeverAskAgain来标注对应的回调方法并处理

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容