记Android6.0动态权限处理引发的问题

最近项目上线,有些渠道需要Apk的targetversion设置为26或以上,为此引发一系列的问题记录一下。


Android权限的动态申请

安卓6.0之前的版本,所有权限只要在文件中声明,系统都会默认给权限。安卓6.0以后,如果app的targetversion低于23的,安卓还是会使用旧版本的权限机制。高于23的,安卓会启用新的权限检测机制。那么,完整的权限申请流程是咋样的?下面会列举一下整个流程以及其中自己遇到的一些坑。

  1. 检测权限接口
    Android有两个检测权限的接口,ContextCompat.checkSelfPermissionPermissionChecker.checkSelfPermission()。
    这两个接口的区别是如果targetversion23以下的话,即使你的设备是在Android6.0以上,ContextCompat.checkSelfPermission返回的值都会是0(PERMISSION_GRANTED)。所以针对targetversion23以下的设置,需要调用PermissionChecker.checkSelfPermission()。
  2. 根据检测结果决定调用是否需要请求权限
    这里需要注意的是检测结果未授权的话还需要分两种情况,一种是请求过但是玩家拒绝了,另外一种是未请求的。
    如果是没有权限,调用ActivityCompat.requestPermissions去请求权限,onRequestPermissions中回调使用ActivityCompat.shouldShowRequestPermissionRationale检测玩家是否拒绝,如果是拒绝的话需要再次弹出窗口和玩家说明为什么需要这个权限,然后再次请求权限。玩家拒绝过后第二次请求权限时,权限窗口会有一个不再提示的选项,玩家如果点了不再提示的选项并再次拒绝。需要在onRequestPermissions通过ActivityCompat.shouldShowRequestPermissionRationale检测是否拒绝。
    注意,ActivityCompat.shouldShowRequestPermissionRationale返回false有3种情况
    1重来没有询问过
    2拒绝并选择不再提醒
    3已授权
    下面贴一张流程图,网上找的=。=
  3. 这次适配遇到的一个大坑,就是Unity在使用Application.persistentDataPath的时候,有存储权限和没有存储权限返回的是两个路径,这个在小米的机型上测试是这样的,但是还不确定是否在所有的手机上都会有这样的问题,所以有些路径如果是一开始就使用Application.persistentDataPath拼接好的,那么就需要在获取存储权限的时候就重新设置一下这个路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值