在上一篇Android权限中,我们介绍了一些权限相关的知识,也简述了新的Android M带来的权限变化,我们如何应对这种变化?是摆着我们面前的紧要问题。
现在我们的业务的targetSdkVersion是小于23的,如果有一天我们需要升级到23,那么如何保证业务能按之前一样功能正常?
对我们来说,当升级到23后,在业务需要使用某项权限的时候,会弹窗让用户选择,当用户拒绝权限的时候,我们的业务如果没有正常处理,极有可能会导致程序异常,比如出现各种crash、页面异常显示、操作无响应等等问题。
针对上面的疑问,我们做了如下的工作:
主要分三部分:梳理权限及功能的对应关系、屏蔽权限测试影响、机型权限检查,如下图。
下面分别介绍三部分实际的内容:
通过以下的手段把业务的权限列表梳理出来:
1、获取业务本身自己的权限
可以通过PackageManager.getPackageInfo.(pkgName, PackageManager.GET_PERMISSIONS).requestedPermissions获取到。
2、获取其他业务的权限
可以通过Android XmlResourceParser解析AndroidManifest.xml文件获取到。
前提:手机需要root过。
Xposed 框架需要使用安装器进行安装,所以我们需要先安装Xposed 框架安装器,安装完成打开后点击框架(如图中红框位置),进行框架的安装。
点击后进入框架安装、升级界面,我们点击“安装/更新”,会出现ROOT授权提示,许可即可。Xposed 框架安装完成后重启手机才能激活,可直接点击重启也可手动重启。
安装Permission Master权限修改器,网上可以直接下载到。
勾选后模块就开始发挥作用了。
禁止/允许某个权限后,对权限相应的功能进行测试,看功能是否正常。
针对Android的权限机制,做了一个简单的权限检查DEMO,主要功能如下:
1、根据输入的权限,检查手机上该权限是否可用。
2、如果权限不可用,尝试申请下该权限,返回结果。
3.1 targetSdkVersion、compileSdkVersion配置
在build.gradle中可以灵活的指定targetSdkVersion、compileSdkVersion版本,如果需要检查6.0以上的系统,请都设置成23,如6.0以下的,请根据实际项目情况设置。
我们把所有待检查的权限都放到一个列表数组中,比如
做完后续的检查输入源。
如果是23版本的,使用checkSelfPermission进行检查,否则使用checkCallingOrSelfPermission进行检查,当然也可以直接用v4兼容库的ContextCompat.checkSelfPermission(),这样就不需要区分版本了。
当没有权限的时候,我们尝试用v4兼容库的ActivityCompat.requestPermissions去申请权限,根据onRequestPermissionsResult返回的结果来写结果文件。
提示:23版本的在demo运行的时候,可能会弹权限提示框。
附上一个简单的流程图:
根据权限列表,可以给出在某一机型上实际的权限结果。
比如:
通过权限检查,在机型A上得出了如下结果:
机型:A
固件版本:***
权限检查情况:
权限允许列表 | 电话、短信、读写存储卡等 |
---|---|
权限限制列表 | 弹窗、创建快捷方式等 |
根据上面的权限和功能的梳理,我们得出弹窗、快捷方式对应的功能
弹窗 | PUSH功能、提醒功能等 |
---|---|
创建快捷方式 | 桌面创建快捷方式 |
在结合Xposed屏蔽权限后的测试结果
屏蔽弹窗权限后 | PUSH功能的主动下发失效,程序没有针对这种异常进行处理 |
---|---|
屏蔽创建快捷方式后 | 桌面创建快捷方式失效,程序出现crash |
综合以上这些,基本可以评估业务在该机型上的表现结果了。