美文网首页
Android运行时权限机制和动态申请权限

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

作者: 南小夕 | 来源:发表于2018-09-12 13:08 被阅读0次

运行时权限机制是 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来标注对应的回调方法并处理

相关文章

网友评论

      本文标题:Android运行时权限机制和动态申请权限

      本文链接:https://www.haomeiwen.com/subject/irjvgftx.html