因为公司的 App、组件、模块都是基于 target 22 和 support 24 进行开发的,所以要看下官方文档 releases/platforms 和 libraries/support-library 相关的文档,从中找到影响点。我们受影响主要有 2 个方面:
-
一、运行时权限申请,(这个是大头)
-
二、其他问题
找轮子
因为第一个权限问题是比较普遍的,所以应该有相关的开源项目支持,为了效率,我们就不重复制造轮子。参考各个比较流行的开源方案,做了一下对比:
通过以上对比,我们决定使用 AndPermission 的方案,因为这个对于我们现有 App 的侵入是最少的,改动点比较少,而且支持 Appliction 传入(其实当使用 Application 传入时候,会有问题,后面再说)。
说下 AndPermission
当时的考虑点是我们公司很多 SDK 设计的时候是没有 Activity 的引用。但是我们的 SDK, 基本有个 Application 这个引用的,所以选择了一个能够支持传入 Applicaiton 就能够判断权限回调的库。
为什么 AndPermission 能够支持呢?因为 AndPermission 在权限校验的时候会启动 PermissionActivity,并且加上了 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);,所有的权限请求都是在这个 PermissionActivity 处理,而且改动也比较少。
AndPermission 这个库的动态权限请求具体过程大伙可以看下 AndPermission 这个库的源码。(https://github.com/yanzhenjie/AndPermission)使用方式如下:
从 API 调用来看是十分简单好用的。然后我又仔细看了一下它的实现过程,发现了有些不符合我们产品需求的地方:
-
业务方接入需要简单,需要有一套默认的权限申请失败提示框
-
弹框提醒权限必须是 Activity 的。但是 AndPermission 是支持 Application 传入的,那么就会有问题
-
比如我用户点击某个按钮导致后面的方法链中有可能连续调用多次的权限请求