You need to enable JavaScript to run this app. Android申请录音、读取手机权限后重建Activity出现循环问题如何解决
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.07 06:24:03