You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android申请相册相机权限遇resultCode=-1,权限回调失效问题

问题诊断与解决方案

1. 权限回调不触发的核心修复

在Fragment里申请权限时,必须调用Fragment自身的requestPermissions()方法,别用Activity的getActivity().requestPermissions()——后者的回调只会传到Activity,Fragment收不到。

正确发起请求的代码:

// ProfileFragment中发起权限申请
requestPermissions(
    new String[]{Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE},
    REQUEST_CODE_PERMISSIONS
);

同时,在Fragment里重写onRequestPermissionsResult,还要保证Activity的同方法里调用super,不然会拦截Fragment的回调:

// ProfileFragment的回调处理
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == REQUEST_CODE_PERMISSIONS) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限过了,打开相册/相机
            openImagePicker();
        }
    }
}

// MainActivity里别瞎处理Fragment的权限逻辑,一定要调用super
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}

2. RESULT_OK与权限结果的混淆问题

你搞混了两个常量的含义:

  • RESULT_OK是-1,用于判断startActivityForResult的返回结果
  • PackageManager.PERMISSION_GRANTED是0,用于判断权限申请结果

别用RESULT_OK去判断权限,改成用PackageManager的常量:

// 错误示例:用RESULT_OK判断权限
if (resultCode == RESULT_OK) { ... }

// 正确示例:用权限专用常量判断
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
    // 权限通过
}

如果你的代码里手动定义了private static final int RESULT_OK = 0;,赶紧删掉,直接用Activity.RESULT_OK。

3. 图片选择与展示的正确流程

权限通过后,打开相册并展示图片到idProfile的代码示例:

private void openImagePicker() {
    Intent pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(pickIntent, REQUEST_CODE_IMAGE_PICK);
}

@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQUEST_CODE_IMAGE_PICK && resultCode == Activity.RESULT_OK && data != null) {
        Uri imageUri = data.getData();
        ImageView profileView = requireView().findViewById(R.id.idProfile);
        // 用Glide加载更稳妥,也可以用原生方法setImageURI
        Glide.with(this).load(imageUri).into(profileView);
    }
}

4. 额外注意事项

  • Android 13+ 相册权限要申请READ_MEDIA_IMAGES,别用旧的READ_EXTERNAL_STORAGE
  • 申请前先检查权限状态,避免重复弹窗:
if (ContextCompat.checkSelfPermission(requireContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(...);
} else {
    openImagePicker();
}

内容的提问来源于stack exchange,提问作者parwez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:15:13