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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 09:46:16