Android中基于PermissionsDispatcher封装的Aop权限管理

                            Android中基于PermissionsDispatcher封装的Aop权限管理

       分享一个自己用的好的权限管理工具,之前也用过Rxpermissions,不能说不好只是在有些有局限性。技术嘛总在更新自己也得学会接受新技术。

本文参考作者https://blog.csdn.net/u013700502/article/details/79748829

6.0运行时申请权限已经是一个老生常谈的内容了,最近项目TargetSDKVersion升到23以上,所以我们也需要做权限管理,我想到的需求是这样的:


  1. 支持单个权限、多个权限申请 

  2. 运行时申请 

  3. 无侵入式申请,无需关注权限申请的逻辑 

  4. 除了Activity、Fragment之外,还需要支持Service中申请 

  5. 对国产手机做兼容处理


第一、二点,Google都有对应的API;

第三点可以通过自定义注解+AOP切面方式来解决。


为什么采用AOP方式呢?首先看AOP定义: 面向切面编程(Aspect-Oriented Programming)。


如果说,OOP(面向对象)如果是把问题划分到单个模块的话,那么AOP就是把涉及到众多模块的某一类问题进行统一管理。 因为我们申请权限的逻辑都是基本一样的,所以可以把申请权限的逻辑统一管理。


第四点稍微有点麻烦,因为Google提供的API只支持在Activity和Fragment中去申请权限,Service中并没有相应的API,比如项目中的某个Service里需要拿到当前位置信息,并且不能确定定位权限已经给了,所以在定位之前仍然需要判断有没有定位权限,按照常规逻辑好像是行不通了。肿么办呢?先说一下我想到的办法:通过一个透明的Activity去申请权限,并且把申请结果返回来,最后实践也是这么做的,具体思路请往下看。


第五点也比较麻烦,如果都按Google标准来,那就不用考虑兼容问题了,但是国产安卓手机碎片化比较严重,且基本都修改了ROM,导致申请权限的API跟期望返回的结果不一致,这种的可能就需要特殊处理了。


调研了一下比较流行的三方库,如 PermissionsDispatcher、RxPermissions,做了一个简单的总结:


https://github.com/permissions-dispatcher/PermissionsDispatcher

https://github.com/tbruyelle/RxPermissions


Android中基于PermissionsDispatcher封装的Aop权限管理


RxPermissions是基于RX的思想,支持链式调用,简单方便,但是他不支持Service调用;


PermissionsDispatcher使用了编译时解析注解的方式,通过apt自动生成.class方式帮我们去写申请权限的逻辑,很好很强大,并且适配了小米手机,但是它也不支持Service中去申请权限。考虑到我们项目中的应用场景并且借鉴了PermissionsDispatcher的申请权限的逻辑,决定基于AOP方式手动撸一个权限管理库出来。

工作太忙了具体的书面就不说了奉上代码吧。

具体的代码我奉上有原生库的使用和Gradle的引用版本


作者源码https://github.com/crazyqiang/Aopermission