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

Android 13中READ_EXTERNAL_STORAGE权限未请求的适配方案咨询

适配Android 13(SDK33)读取PDF/文档的权限解决方案

问题原因

Android 13(API 33)开始,READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE权限已被废弃,系统会直接忽略对这两个权限的请求,因此不会弹出权限窗口。针对PDF、文档这类非媒体文件,Android官方推荐使用更安全的**存储访问框架(Storage Access Framework)**来获取文件访问权,而非传统的存储权限。

修改方案

1. 移除废弃权限声明

打开AndroidManifest.xml,删除以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

如果你的应用同时需要访问图片/音频/视频等媒体文件,可以添加对应的媒体权限(非必需):

<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />

2. 使用文件选择器获取文件(推荐方案)

替换原有的权限请求逻辑,调用系统文件选择器让用户主动选择PDF或文档文件,示例代码:

private static final int PICK_DOCUMENT_CODE = 1001;

// 触发文件选择
private void pickDocumentFile() {
    Intent pickIntent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
    pickIntent.addCategory(Intent.CATEGORY_OPENABLE);
    // 指定可选择的文件类型,按需添加更多格式
    String[] allowedMimeTypes = {
        "application/pdf",
        "application/msword",
        "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
        "text/plain"
    };
    pickIntent.setType("*/*");
    pickIntent.putExtra(Intent.EXTRA_MIME_TYPES, allowedMimeTypes);
    
    startActivityForResult(pickIntent, PICK_DOCUMENT_CODE);
}

// 处理选择结果
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == PICK_DOCUMENT_CODE && resultCode == RESULT_OK) {
        if (data != null) {
            Uri fileUri = data.getData();
            // 通过ContentResolver读取文件内容
            try (InputStream inputStream = getContentResolver().openInputStream(fileUri)) {
                // 在这里处理文件流,比如解析PDF、读取文档内容
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

3. 特殊场景:批量访问所有文件(不推荐)

如果你的应用是文件管理器类,必须批量访问设备上的所有PDF/文档,可以使用MANAGE_EXTERNAL_STORAGE权限,但该权限属于敏感权限,Google Play审核严格,需谨慎使用:

  • 在Manifest中添加权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
                 android:minSdkVersion="30" />
  • 请求权限的代码:
private static final int MANAGE_STORAGE_CODE = 1002;

private void requestFullStorageAccess() {
    if (!Environment.isExternalStorageManager()) {
        Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
        Uri packageUri = Uri.fromParts("package", getPackageName(), null);
        intent.setData(packageUri);
        startActivityForResult(intent, MANAGE_STORAGE_CODE);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 08:20:24