最近项目上线,有些渠道需要Apk的targetversion设置为26或以上,为此引发一系列的问题记录一下。
Android权限的动态申请
安卓6.0之前的版本,所有权限只要在文件中声明,系统都会默认给权限。安卓6.0以后,如果app的targetversion低于23的,安卓还是会使用旧版本的权限机制。高于23的,安卓会启用新的权限检测机制。那么,完整的权限申请流程是咋样的?下面会列举一下整个流程以及其中自己遇到的一些坑。
- 检测权限接口
Android有两个检测权限的接口,ContextCompat.checkSelfPermission和PermissionChecker.checkSelfPermission()。
这两个接口的区别是如果targetversion在23以下的话,即使你的设备是在Android6.0以上,ContextCompat.checkSelfPermission返回的值都会是0(PERMISSION_GRANTED)。所以针对targetversion23以下的设置,需要调用PermissionChecker.checkSelfPermission()。 - 根据检测结果决定调用是否需要请求权限
这里需要注意的是检测结果未授权的话还需要分两种情况,一种是请求过但是玩家拒绝了,另外一种是未请求的。
如果是没有权限,调用ActivityCompat.requestPermissions去请求权限,在onRequestPermissions中回调使用ActivityCompat.shouldShowRequestPermissionRationale检测玩家是否拒绝,如果是拒绝的话需要再次弹出窗口和玩家说明为什么需要这个权限,然后再次请求权限。玩家拒绝过后第二次请求权限时,权限窗口会有一个不再提示的选项,玩家如果点了不再提示的选项并再次拒绝。需要在onRequestPermissions通过ActivityCompat.shouldShowRequestPermissionRationale检测是否拒绝。
注意,ActivityCompat.shouldShowRequestPermissionRationale返回false有3种情况
1重来没有询问过
2拒绝并选择不再提醒
3已授权
下面贴一张流程图,网上找的=。= - 这次适配遇到的一个大坑,就是Unity在使用Application.persistentDataPath的时候,有存储权限和没有存储权限返回的是两个路径,这个在小米的机型上测试是这样的,但是还不确定是否在所有的手机上都会有这样的问题,所以有些路径如果是一开始就使用Application.persistentDataPath拼接好的,那么就需要在获取存储权限的时候就重新设置一下这个路径。