Android申请录音、读取手机权限后重建Activity出现循环问题如何解决
无限循环重建的核心原因
- 权限发起逻辑无前置校验:原代码在Activity初始化阶段,未提前校验权限状态就直接调用
requestPermissions。即便权限已经被用户授予,系统收到权限申请调用后仍会直接触发权限回调,返回已授权结果;只要回调里触发recreate(),Activity重新初始化时又会重复执行申请逻辑,再次触发授权回调和重建,形成闭环死循环。 - 权限回调判断逻辑不完整:
- 未匹配自定义的
requestCode,任意权限申请的回调都会进入判断分支 - 仅校验了授权数组中第一个位置的录音权限,没有覆盖读取手机状态的权限校验,只要录音权限的授权结果为允许,就会触发重建逻辑,哪怕读取手机状态权限被用户拒绝
- 未做全量授权校验,仅单权限通过就触发重建,不符合“两项权限同时授予才重建”的预期
- 未匹配自定义的
修正实现方案
1. 调整权限发起逻辑
发起权限申请前,逐个校验所需权限的授予状态,仅当存在未授权的权限时才发起申请;全量授权的场景直接跳过申请流程,从根源上避免重建后重复触发权限回调:
int requestCode = 200; List<String> pendingPermissions = new ArrayList<>(); // 逐个校验权限授予状态 for (String perm : permissions) { if (ContextCompat.checkSelfPermission(this, perm) != PackageManager.PERMISSION_GRANTED) { pendingPermissions.add(perm); } } // 仅存在未授权权限时才发起请求 if (!pendingPermissions.isEmpty() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { requestPermissions(pendingPermissions.toArray(new String[0]), requestCode); }
2. 重写权限回调逻辑
回调中先匹配对应请求码,再遍历校验所有权限的授权结果,仅当两项权限全部被授予时才触发一次recreate(),否则提示用户完成授权:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // 匹配自定义请求码,非目标权限申请的回调直接退出 if (requestCode != 200) { return; } // 遍历校验所有授权结果,确认两项权限全部授予 boolean isAllGranted = true; for (int grantResult : grantResults) { if (grantResult != PackageManager.PERMISSION_GRANTED) { isAllGranted = false; break; } } if (isAllGranted) { recreate(); } else { Toast.makeText(this, "Error, give the permissions", Toast.LENGTH_LONG).show(); } }
运行效果
当用户完成两项权限的全部授权后,第一次recreate()触发的Activity重建流程中,权限申请逻辑会检测到所有权限均已授予,不会再发起新的权限请求,自然不会重复进入权限回调、不会再次调用recreate(),彻底断开重建循环,实现“两项权限全部授权完成后仅重建一次Activity”的预期。
内容的提问来源于stack exchange,提问作者RGS
相关产品推荐
相关产品推荐

