Android 13下无法访问PDF、贴纸等特定文件类型的权限问题求助
Android 13 非媒体文件访问权限问题解决方案
问题核心原因
Android 13(API 33)对文件权限体系做了关键变更:
- 原有的
READ_EXTERNAL_STORAGE权限被废弃,且你在Manifest中给它设置了android:maxSdkVersion="32",导致Android 13设备上无法申请该权限,调用旧版存储权限请求方法(比如requestExternalStorageAuthorization())会直接返回DENIED_ALWAYS。 - 新增的
READ_MEDIA_IMAGES/VIDEO/AUDIO仅覆盖系统媒体库内的对应类型文件,PDF、贴纸等非媒体类文件不在权限覆盖范围内,所以即使申请了这些权限也无法访问。
权限配置修正
调整Manifest中的权限声明,适配不同版本的权限逻辑:
<!-- Android 13+ 专属媒体权限 --> <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" /> <!-- Android 12及以下存储权限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
注:Android 13+ 已不再需要
WRITE_EXTERNAL_STORAGE权限,写入媒体库直接用MediaStore API,写入APP专属存储无需权限。
非媒体文件访问的两种可行方案
方案1:使用文件选择器(推荐,合规性高)
如果仅需要用户选择单个/少量非媒体文件,直接通过ACTION_OPEN_DOCUMENT或ACTION_GET_CONTENT启动系统文件选择器,用户选中文件后通过返回的Uri即可访问,无需申请任何额外权限。示例逻辑:
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply { addCategory(Intent.CATEGORY_OPENABLE) type = "application/pdf" // 针对PDF,贴纸可设置对应MIME类型,如image/webp } startActivityForResult(intent, REQUEST_CODE_PICK_FILE)
方案2:申请全文件访问权限(仅特殊场景使用)
如果需要批量访问设备上的非媒体文件(比如扫描所有PDF),需申请MANAGE_EXTERNAL_STORAGE特殊权限:
- 在Manifest中添加权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" android:minSdkVersion="30" />
- 无法通过常规权限弹窗请求,必须引导用户跳转到应用设置页面开启权限:
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION) intent.data = Uri.parse("package:" + packageName) startActivity(intent)
注意:该权限仅适用于文件管理器、备份工具等特殊类型APP,Google Play审核会严格限制普通APP使用此权限。
Android 13 文件权限特殊注意事项
- 媒体权限拆分:不再使用统一的存储权限,需按图片/音频/视频分别申请对应
READ_MEDIA_*权限。 - 非媒体文件限制:除文件选择器和
MANAGE_EXTERNAL_STORAGE外,无其他方式直接访问设备上的非媒体文件。 - 旧权限失效:
READ_EXTERNAL_STORAGE在Android 13上无法申请,系统会直接拒绝相关请求。 - 写入权限简化:写入媒体库无需
WRITE_EXTERNAL_STORAGE,写入APP专属目录(getExternalFilesDir())无需任何权限。
权限请求逻辑调整
你当前调用的requestExternalStorageAuthorization()是针对旧版存储权限的方法,在Android 13上完全不适用,需替换为:
- 针对媒体文件:分别请求
READ_MEDIA_IMAGES、READ_MEDIA_AUDIO、READ_MEDIA_VIDEO权限。 - 针对非媒体文件:采用上述两种方案之一,无需调用旧版存储权限请求方法。
内容的提问来源于stack exchange,提问作者Fragosojp
相关产品推荐
相关产品推荐

