Android Java权限申请时onRequestPermissionsResult回调未触发
问题根因
你的权限回调始终不触发,核心错误是对权限回调的实现逻辑理解有误:OnRequestPermissionsResultCallback 不是你随便new一个匿名实例就能自动接收系统返回结果的,你创建的这个匿名对象既没有绑定到发起申请的Activity/Fragment,也没有被系统注册,系统完全不知道这个回调的存在,自然不会调用它。
另外你代码里所有Toast.makeText()之后都没调用.show(),就算逻辑走到了也不会弹出提示。
正确实现方案
权限申请的结果回调是Activity和Fragment的内置生命周期方法,必须重写对应组件的onRequestPermissionsResult方法,系统才会在用户操作权限弹窗后把结果回传给你。
正确代码如下:
// 权限请求码建议定义成常量,避免硬编码魔法值 private final int CAMERA_PERMISSION_REQ_CODE = 1; void checkPermissions(){ if(ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_DENIED){ // 直接发起权限申请即可,不需要在申请前单独new回调对象 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_REQ_CODE); } else { // 注意Toast必须调用show()才会生效 Toast.makeText(this, "Permission Granted", Toast.LENGTH_LONG).show(); // 执行需要相机权限的业务逻辑 doCameraRelatedWork(); } } // 重写所在Activity的权限结果回调,系统会自动调用这个方法 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if(requestCode == CAMERA_PERMISSION_REQ_CODE && grantResults.length > 0){ for (int result : grantResults) { if(result != PackageManager.PERMISSION_GRANTED){ Toast.makeText(this, "Permission Not Yet Granted", Toast.LENGTH_LONG).show(); return; } } // 所有权限已授予,执行业务逻辑 doCameraRelatedWork(); } } private void doCameraRelatedWork(){ // 这里写需要相机权限的业务代码 }
避坑提示
- 如果是在Fragment中发起权限申请,一定要调用Fragment自身的
requestPermissions方法,不要用宿主Activity的方法发起,否则回调只会走到Activity层,不会触发Fragment的回调 - 如果项目适配了AndroidX,建议直接使用
Activity Result API实现权限申请,不需要自己重写回调方法,代码更简洁也不容易出错 - 不要在权限回调里持有长生命周期引用,避免内存泄漏
内容的提问来源于stack exchange,提问作者Confidence
相关产品推荐
相关产品推荐

