效果展示
以上是演示请求一个相机权限的过程:
首次申请(顶部提醒)-拒绝-再次申请(顶部提醒)-再次拒绝(并勾选禁止再次询问)-再次申请(中部弹窗引导)-在设置页不授权-返回-再次申请(中部弹窗引导)-在设置页将相机权限设为允许-返回app
在此过程中,任意一次拒绝和允许,都可以及时的拿到允许/拒绝的结果,进而在页面展示授权状态或者执行自己授权后的逻辑。以上的这些所有逻辑,只需要一句代码就能搞定,你相信吗?
是的,EasyPermission她来了,在项目中集成之后,安卓权限的检查、申请、提示、结果回执,一句代码就可以搞定。
EasyPermission.build()
.mRequestCode(RC_CODE_PERMISSION)//请求code,自己定义
.mPerms(Manifest.permission.CAMERA)//权限,可支持多个
.setAutoOpenAppDetails(true)//默认true
.mAlertInfo( new PermissionAlertInfo("**需要申请摄像头权限",
"**需要申请摄像头拍摄权限,以便您能够通过扫一扫实现扫描二维码;通过拍照更换您帐号的头像;拍照上传一些注册帐号需要的证件信息。拒绝或取消授权将影响以上功能,不影响使用其他服务"))
.mResult(new EasyPermissionResult() {
@Override
public void onPermissionsAccess(int requestCode) {
super.onPermissionsAccess(requestCode);
//权限已通过
}
@Override
public void onPermissionsDismiss(int requestCode, @NonNull List<String> permissions) {
super.onPermissionsDismiss(requestCode, permissions);
//权限被拒绝
}
).requestPermission();
接下来我们就看下它是怎么实现的。
需求来源
最近国家工信部对手机隐私安全越来越重视,权限不能滥用,不能随意申请(有些应用在启动时就申请一堆权限),更不能强制申请(有些权限不通过就不让进入应用的,已经被下架了)。最近公司又接到上头通知:公司某款app中有申请定位权限时没有对用户解释说明,需要及时整改。
和产品沟通后借鉴小红书、京东,类似这种在请求权限的时候,在底下弹出系统弹窗时,同时在顶部浮出说明信息;如果权限被禁止了,就在中部弹出说明弹窗,引导去设置页面中完成授权。
方案分析
咨询了隔壁IOS的现状、权限在项目中,权限的申请可以也必须配置说明文案,那么在使用申请权限时系统就会弹出信息说明。
可是安卓的动态权限管理比较松散(无情的吐槽),请求权限真的是干巴巴的请求,就像上面图1底部的系统弹窗。要像京东、小红书那样实现申请弹窗时提示信息,收到权限或者拒绝时隐藏,权限有可能被禁止(拒绝并勾选不再提示),禁止时需要弹窗提醒,引导去设置页返回时又得不到有效的回调(是的,京东从设置页回来的时候,授权后不会继续执行申请权限的逻辑,我们的EasyPermission却完全可以做到)。
根据大致的分析,其实流程也是挺清晰的,实现以上效果的流程图如下(最终的EasyPermission库的最终实现思路也是基于此做的):
方案中需要考虑的问题
看到以上流程图,其实实现起来感觉还好,但是有一些问题: