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对它的审核极严,仅允许文件管理器、备份工具这类特定功能的应用使用。- 在Manifest中添加权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30"/> - 代码中跳转系统设置页引导用户授权:
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的权限政策,否则会被拒审。- 在Manifest中添加权限:
注意事项
- 优先选方案一,既符合Android隐私要求,也能避开权限审核风险。
- Android 13+已不再支持
requestLegacyExternalStorage兼容属性,不要依赖它来解决问题。
内容的提问来源于stack exchange,提问作者User222
相关产品推荐
相关产品推荐

