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
相关产品推荐
相关产品推荐

