Foreword
之前总是有小伙伴问 AndroidUtilCode 中有没有权限工具类,但都被我怼回去了,让先用着其他第三方的,不过,到了如今的 1.11.0 版本的 AndroidUtilCode,这个一直拖欠着的权限工具类总算要问世了,以后小伙伴们如果用 AndroidUtilCode 需要动态授权的话,就不用再多依赖一个第三方库了,下面来介绍下其功能。
Functions
- 兼容安卓各版本,包括 Android 8.0
- 支持任意地方申请权限,不仅限于 Activity 和 Fragment 等
- 支持多权限同时申请
- 采用链式调用,一句话解决权限申请
Achieve
首先来介绍其实现方式,关于运行时权限的介绍可以在官网查看 -> 传送门。关于危险权限列表,我封装危险权限常量类 PermissionConstants.java,代码如下所示:
1 | import android.Manifest; |
为了适配 Android 8.0,我在申请权限的时候,会把清单文件中使用到的同组的权限都一次性申请完毕,相关代码如下所示:
1 | private static final List<String> PERMISSIONS = getPermissions(); |
为了支持任意地方都可以申请权限,我在 PermissionUtils.java 中封装了 PermissionActivity,源码如下所示:
1 | (api = Build.VERSION_CODES.M) |
这样我们便可以自己全权处理权限请求,但启动的这个 PermissionActivity 的主题并不一定符合小伙伴们应用的 Activity 相关主题,所以我留了个设置主题的回调接口,比如可以把这个 Activity 设置为全屏等操作,这样便可无感知地启动一个 Activity,相关主题属性如下:
1 | <style name="ActivityTranslucent"> |
这个应该能适配很多应用了。
当然,如果有设置 rationale 的话,也就是设置拒绝权限后再次请求的回调接口,此时便会走 sInstance.rationale(this)
,具体代码如下所示:
1 | (api = Build.VERSION_CODES.M) |
逻辑就是如果 rationale 回调接口 执行了 shouldRequest.again(true);
,那么就会继续申请下去,反之则不再申请,多用在弹出一个提示对话框来让用户选择是否继续请求权限。
最终就是发起请求和接受请求,并把最终状态保存到 mPermissionsGranted
、mPermissionsDenied
和 mPermissionsDeniedForever
中,最终回调 callback 的接口,相关代码如下所示:
1 | private void getPermissionsStatus(final Activity activity) { |
Use
说了那么多,总算到使用了,其实使用起来非常方便,一句话即可,比如我们要申请 android.permission.READ_CALENDAR
权限,那么我们可以去 PermissionConstants.java 中找到其所属组,也就是 CALENDAR,而应用是全屏类型的应用,那么我们可以像下面这样发起请求。
1 | PermissionUtils.permission(PermissionConstants.CALENDAR) |
如果还有不会的可以参考 AndroidUtilCode 中的 demo -> PermissionActivity.java
Tips:推荐小伙伴们最好把权限请求相关的操作都放在一个 helper 类中,就像我 AndroidUtilCode 中 demo 的做法,创建一个 PermissionHelper.java,毕竟有很多权限请求都是重复。
Conclusion
好了,本次的权限工具类介绍就到此结束了,在这么简洁的工具类背后都是本柯基辛勤付出的汗水,疯狂地 debug,疯狂地测试来消除内存泄漏的问题,虽然路途很艰辛,但最终还是成功地完成了该工具类,终于等到你。