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

Android 13 访问PDF及非媒体文件的权限缺失解决方案咨询

解决Android 13+无法访问非媒体文件的问题

核心原因

Android 13(API 33)推出的READ_MEDIA_*权限仅覆盖图片、视频、音频类媒体文件,PDF、贴纸这类非媒体文件不在权限允许范围内,直接用File类访问自然会触发FileNotFoundException。

可行解决方案

  • 方案一:用系统文件选择器(推荐,符合隐私规范)
    通过ACTION_OPEN_DOCUMENT让用户手动选择目标文件,这种方式不需要额外权限,还能访问任意类型文件。示例代码如下:

    // 定义请求码
    private static final int REQUEST_CODE_OPEN_FILE = 1001;
    
    // 启动文件选择器
    private void openFilePicker() {
        Intent pickerIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        pickerIntent.addCategory(Intent.CATEGORY_OPENABLE);
        // 设置可选择的文件类型,*/*表示所有类型,也可指定如application/pdf
        pickerIntent.setType("*/*");
        startActivityForResult(pickerIntent, REQUEST_CODE_OPEN_FILE);
    }
    
    // 处理选择结果
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == REQUEST_CODE_OPEN_FILE && resultCode == RESULT_OK) {
            if (data != null) {
                Uri fileUri = data.getData();
                try {
                    // 通过ContentResolver读取文件流
                    InputStream inputStream = getContentResolver().openInputStream(fileUri);
                    // 后续处理文件流逻辑...
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    若使用AndroidX/Jetpack组件,建议用registerForActivityResult替代startActivityForResult,写法更规范。

  • 方案二:申请MANAGE_EXTERNAL_STORAGE权限(仅特殊场景用)
    这个权限能获取整个外部存储的访问权,但Google Play对它的审核极严,仅允许文件管理器、备份工具这类特定功能的应用使用。

    1. 在Manifest中添加权限:
      <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" 
                       android:minSdkVersion="30"/>
      
    2. 代码中跳转系统设置页引导用户授权:
      if (!Environment.isExternalStorageManager()) {
          Intent authIntent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
          Uri packageUri = Uri.fromParts("package", getPackageName(), null);
          authIntent.setData(packageUri);
          startActivity(authIntent);
      }
      

    授权成功后就能用File类正常访问非媒体文件,但务必确认你的应用符合Google Play的权限政策,否则会被拒审。

注意事项

  • 优先选方案一,既符合Android隐私要求,也能避开权限审核风险。
  • Android 13+已不再支持requestLegacyExternalStorage兼容属性,不要依赖它来解决问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 12:20:10