Android动态权限onRequestPermissionsResult异常:未操作即输出NO日志
解决Android权限申请时提前输出NO日志的问题
我来帮你分析下问题所在,以及怎么修复:
问题根源
多次单独申请权限且requestCode重复
你现在逐个调用requestPermissions()申请权限,还都用了同一个requestCode=1。Android的权限申请是异步的,连续调用多次会让系统依次弹出权限框,每一次用户处理权限后都会触发onRequestPermissionsResult()回调——这就是还没等用户处理完所有权限,就多次输出NO日志的原因。错误的权限检查时机
requestPermissions()是异步方法,调用后会立即返回,不会等用户点击允许/拒绝。如果你在调用requestPerm()后马上检查权限状态,这时候权限还没被授予,自然会直接输出NO,这就是你看到“尚未点击操作就输出NO”的核心原因。
修复方案
我们需要把所有权限一次性申请,并且只在回调里处理最终授权结果:
1. 修改requestPerm()方法,批量申请权限
把需要的5种权限放到一个数组里,一次性发起申请,系统会合并弹出权限对话框(同组权限只会弹一次),既提升体验也避免多次回调的混乱:
public void requestPerm() { if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) { // 汇总所有需要的权限 String[] requiredPermissions = { android.Manifest.permission.CAMERA, android.Manifest.permission.READ_PHONE_STATE, android.Manifest.permission.RECORD_AUDIO, android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE }; // 筛选出未授予的权限 List<String> permissionsToRequest = new ArrayList<>(); for (String perm : requiredPermissions) { if (checkSelfPermission(perm) != PackageManager.PERMISSION_GRANTED) { permissionsToRequest.add(perm); } } // 有未授权权限才发起申请,否则直接执行业务逻辑 if (!permissionsToRequest.isEmpty()) { ActivityCompat.requestPermissions( this, permissionsToRequest.toArray(new String[0]), 1 ); } else { Log.i("errorCheck", "YES"); startRequest(); } } else { // Android 6.0以下无需动态申请,直接执行逻辑 Log.i("errorCheck", "YES"); startRequest(); } }
2. 修改onRequestPermissionsResult(),处理批量权限结果
如果你的业务需要所有权限都通过才能执行startRequest(),可以这样检查所有权限的授予结果:
@Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case 1: { boolean allGranted = true; // 遍历检查每个权限的授予状态 for (int result : grantResults) { if (result != PackageManager.PERMISSION_GRANTED) { allGranted = false; break; } } if (allGranted) { Log.i("errorCheck", "YES"); startRequest(); } else { Log.i("errorCheck", "NO"); // 可选:提示用户需要这些权限才能继续操作 } } break; } }
关键注意点
- 禁止在调用
requestPerm()后立即检查权限:所有权限相关逻辑都要放在onRequestPermissionsResult()回调里,或者在requestPerm()内部处理已授权的情况。 - 批量申请权限:既减少用户操作步骤,也避免多次回调导致的日志混乱。
- 兼容低版本系统:Android 6.0(API 23)以下无需动态申请权限,直接执行业务逻辑即可。
这样修改后,就只会在用户完成所有权限操作后,输出一次YES或NO日志,完全符合你的预期。
内容的提问来源于stack exchange,提问作者Abar New
相关产品推荐
相关产品推荐

