You need to enable JavaScript to run this app. 为何Fragment中onRequestPermissionsResult未被调用,申请相机权限后日志无输出?
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 14:45:04