####为什么需要6.0运行时权限
- 更友好
6.0以前的安装时权限,会在应用安装时列出所有需要的权限,当列出一些危险权限时,用户不知每个权限的具体用途,可能因为这些权限警告而放弃安装应用。对于一些非装不可的应用,用户则不得不被迫接受所有权限,很容易安装了一些流氓APP,体验不佳。 6.0以后的运行时权限,可以在调用相关功能之前判断权限授权状态,并自定义提示弹框告知用户权限用途,使用户清楚了解之后,再授权使用。
- 更稳定
6.0系统的手机对于每个应用,都有个权限设置页面,可以手动开关权限,如果用户在设置页面误关了某个权限,若没在程序运行时做判断,则会导致相关功能的调用失败,引起崩溃等。
####如何实现运行时权限
- 设置targetSdkVersion
只有targetSdkVersion>=23,且安装在6.0以上的手机时,运行时权限机制才能正常运作
手机系统 | targetSdkVersion<23 | targetSdkVersion>=23 |
---|---|---|
5.0+ | 安装时权限 | 安装时权限 |
6.0+ | 安装时权限 | 运行时权限 |
- 代码实现
在需要使用某项权限时,通过V4包的checkSelfPermission判断权限是否授权,通过requestPermissions申请某项权限
1 |
|
在Activity的onRequestPermissionsResult回调方法中,处理权限授权结果
1 |
|
####LsPermission工具类的使用
- 主要实现逻辑参考PermissionGen,封装了权限判断,请求,结果处理等通用逻辑,目前只支持context=AppCompatActivity,如果在Fragment中使用时可以调用getActivity()获取上层AppCompatActivity。
1 |
|
- PermissionUtil内部通过SparseArray保存了requestCode和权限回调的键值对,避免了连续点击时重复回调情况,对于不同的权限申请,推荐使用不同的requestCode,避免回调覆盖的问题。
1 |
|
在权限回调的时候从SparseArray移除Listener
1 |
|
代码地址:LsPermission
除了基本的权限申请逻辑的封装以外,还写了类似微信,支付宝,百度地图等在启动页的权限申请Demo,算是PermissionUtil的简单运用。
参考: Android 6.0 运行时权限处理完全解析 Android 6.0 运行时权限管理最佳实践 聊一聊Android 6.0的运行时权限