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
相关产品推荐
相关产品推荐

