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

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特殊权限:

  1. 在Manifest中添加权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    android:minSdkVersion="30" />
  1. 无法通过常规权限弹窗请求,必须引导用户跳转到应用设置页面开启权限:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:20:03