为何Fragment中onRequestPermissionsResult未被调用,申请相机权限后日志无输出?
Fragment中权限申请回调不触发的常见原因及解决方法
排查点1:权限申请的调用对象错误
如果实际调用的是ActivityCompat.requestPermissions(),而非Fragment自身的requestPermissions()方法,权限结果会直接分发到宿主Activity的回调,Fragment自身的onRequestPermissionsResult永远不会执行。
需将申请逻辑改为调用Fragment自带的方法:
if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // 直接调用Fragment自带的requestPermissions,不要加ActivityCompat前缀 requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE); }
排查点2:权限结果分发链路被拦截
- 宿主Activity如果重写了
onRequestPermissionsResult方法,必须在方法内调用super.onRequestPermissionsResult(requestCode, permissions, grantResults),否则权限结果不会下发给Activity托管的所有Fragment。 - 如果当前Fragment是通过
childFragmentManager添加的嵌套子Fragment,还需要其父Fragment在自身的onRequestPermissionsResult中调用super,才能将结果继续传递给子Fragment。
可在宿主Activity的onRequestPermissionsResult中加调试日志,先确认权限结果是否到达了Activity层,快速定位分发断点。
排查点3:导入库不兼容或类版本错误
- 不要使用已废弃的
android.app.Fragment,必须统一导入androidx.fragment.app.Fragment(或同版本的support库Fragment),旧版系统Fragment的权限回调分发逻辑存在缺陷。 - 确保项目中不要同时混用androidx和旧support库的权限相关API,否则会导致分发链路断裂。
排查点4:调用时机异常
如果在Fragment未与宿主Activity完成绑定时就发起权限申请(例如在Fragment构造方法、onAttach()之前的生命周期节点调用),Fragment的注册状态异常,会导致回调分发失败。
可在发起申请前增加状态判断,确保Fragment已挂载:
if (isAdded() && ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_PERMISSION_CODE); }
排查点5:方法签名不匹配
重写onRequestPermissionsResult时,需确保方法签名与父类完全一致:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // 业务逻辑 }
如果IDE没有提示该方法的@Override生效,说明签名错误(例如参数顺序错误、权限数组类型写错),导致实际是新增了一个普通方法,而非重写Fragment的回调方法。
排查点6:Manifest未注册对应权限
如果没有在AndroidManifest.xml中注册<uses-permission android:name="android.permission.CAMERA" />,系统会直接忽略权限申请请求,不会弹出授权框也不会触发回调。
内容的提问来源于stack exchange,提问作者lukasniessen
相关产品推荐
相关产品推荐

