Android运行时(runtime)权限是6.0引入的概念,与之相对应的是install-time策略。runtime权限继承了install-time的部分特性,对于普通权限申请依然使用install-time 策略,但是对于dangerous级别的权限,就会使用runtime策略来处理。
因此,一个权限的申请和授予是分成两个阶段来看的。
一个App执行何种权限策略,总结起来一句话:
对于App targeSdk>=23且运行的Android版本(SDK_VER>=23)为6.0以上,则使用runtime权限策略处理,其余情况使用install-time权限。
runtime权限和install-time权限的区别和联系:
1. 联系:runtime权限授予是从installtime权限演进而来的
(1) 所用到的权限,必须在AndroidManifest中显式申请
(2) 对于Normal权限,都是安装即授予
2. 区别:runtime权限主要对dangerous级别权限进行了进一步管控
runtime权限策略,除了需要在AndroidManifest中显式申请,还需要开发者在代码中用到的地方加入显式的申请的逻辑。
Normal权限和dangerous权限:
Normal permissions(正常权限):当app需要访问沙箱外对于用户隐私或其他app应用操作风险较小的数据和资源,所需要的权限,定义为Normal。
Dangerous permassions(危险权限):当访问的数据或资源涉及用户私人信息或可能会影响用户的存储数据或其他应用程序的操作,此时为Dangerous权限
Google对于Normal和Dangerous权限有自己的定义,用户也可以根据自己的需求,定义Normal和Dangerous权限。
具体参考:https://developer.android.com/guide/topics/permissions/overview#normal-dangerous
runtime权限操作步骤:(参考官网 https://developer.android.com/training/permissions/requesting)
(1) 使用Android Support Libarary申请,可以做到前向兼容
(2) AndroidManifest 添加所需权限 (这一步与installtime相同)
(3) 判断是否有权限,使用ContextCompat.checkSelfPermission()
(4) 没有权限申请权限,使用requestPermissions()手动申请;申请结果通过onRequestPermissionsResult()接口返回; (easyPermission中将此接口处理成了三个返回接口,AfterPermissionGranted,onPermissionGranted和onPermissionDenied)
(5) 判断是否需要给用户解释,shouldShowRequestPermissionRationale()(这个接口很有意思,它反映的是拒绝的情况,我们知道对于dangerous权限有系统默认拒绝,手动选择永久拒绝,手动选择暂时拒绝,这里返回true表示手动暂时拒绝,其余两种都是返回false)
使用Google的easyPermissions快速完成runtime权限申请:
github的源地址:https://github.com/googlesamples/easypermissions
Google为了runtime权限申请,专门写了一个库,可以供Andriod开发者快速完成runtime权限申请及后处理。但是了解其背后的处理逻辑,是很重要的。因此我花了一个权限申请的流程图,可供同学们参考,顺着流程图结合以上5个步骤,就能够更加深刻的明白runtime权限申请的背后逻辑了,也就可以放心大胆的使用easyPermissions了。