Fragment中请求READ_EXTERNAL_STORAGE权限始终返回false的问题
权限请求result始终为false的原因分析
我的目标是在Fragment中获取访问相册的权限并选择图片,以下是我的代码:
binding.memoryImage.setOnClickListener(v -> { try { if (ActivityCompat.checkSelfPermission(getContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { requestPermissionLauncher.launch(Manifest.permission.READ_EXTERNAL_STORAGE); } else { openGallery(); } } catch (Exception e) { e.printStackTrace(); } }); private void openGallery() { Intent iGallery = new Intent(Intent.ACTION_PICK); iGallery.setType("image/*"); iGallery.setData(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); folderResult.launch(iGallery); } private ActivityResultLauncher<String> requestPermissionLauncher = registerForActivityResult( new ActivityResultContracts.RequestPermission(), result -> { if (result) { openGallery(); } else { Toast.makeText(getContext(), "Permission denied", Toast.LENGTH_SHORT).show(); } } ); ActivityResultLauncher<Intent> folderResult = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() { @Override public void onActivityResult(ActivityResult result) { if (result.getResultCode() == Activity.RESULT_OK) { imageURI = result.getData().getData(); binding.memoryImage.setImageURI(imageURI); } } });
可能的原因及解决方案
Manifest未声明对应权限
检查AndroidManifest.xml是否添加了权限声明。Android 12及以下版本需添加:<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />Android 13(API 33)及以上版本,系统将媒体权限细分,访问图片需声明:
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />Android 13+权限适配错误
Android 13及以上版本不再处理READ_EXTERNAL_STORAGE的权限请求,直接返回false。需根据系统版本动态选择权限:private String getTargetPermission() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { return Manifest.permission.READ_MEDIA_IMAGES; } else { return Manifest.permission.READ_EXTERNAL_STORAGE; } }权限检查和请求时使用该方法返回的权限即可。
权限被永久拒绝
若用户之前勾选了"不再询问"并拒绝权限,后续请求会直接返回false。此时需判断是否可继续弹窗请求,若不可则引导用户前往设置开启:if (!shouldShowRequestPermissionRationale(getTargetPermission())) { Intent settingsIntent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); Uri uri = Uri.fromParts("package", requireContext().getPackageName(), null); settingsIntent.setData(uri); startActivity(settingsIntent); }权限请求Launcher注册时机错误
确保requestPermissionLauncher在Fragment的onCreate或更早的生命周期方法中注册,不要在点击事件内动态注册,否则会导致Launcher未正确绑定,请求无效返回false。
内容的提问来源于stack exchange,提问作者Niccolò Bertozzi
相关产品推荐
相关产品推荐

