Activity权限申请问题

303 阅读1分钟

崩溃日志:

发现在循环请求权限,最终导致StackOverFlowError崩溃

分析Log,最终这句话引起了我的注意:

03-13 08:28:01.170776 7208 7208 W Activity: Can request only one set of permissions at a time

分析Activity源码:

注意下mHasCurrentPermissionsRequest这个变量

实际上Activity权限申请发起后,Activity会执行startActivityForResult 启动权限管理App的Activity,并等待结果返回。

dispatchActivityResult中会调用dispatchRequestPermissionsResult方法,然后将mHasCurrentPermissionsRequest置为false

说白了,一个Activity发起权限申请1后,直到结果返回前,原则上中间是不允许再请求权限2的,否则对于此时2的权限申请,Activity会直接返回长度为0的结果集:

onRequestPermissionsResult(requestCode, new String[0], new int[0]);

示例代码(具体代码不贴出):

假设当前出现了Can request only one set of permissions at a time这个问题,那么这里回调的permissions实际上size=0,没有内容

这里对permissions做了检查,如果permissions中没有授予的权限将被加到deny这个list中,

所以这里实际上deny是empty的,empty时项目逻辑是再去检查还需要哪些权限,再进行申请,再申请时依然遇到了Can request only one set of permissions at a time的问题,最终形成了循环申请。