Android 13起需显式声明READ_MEDIA_IMAGES等权限并配置targetSdkVersion≥33,uni.authorize不支持该权限,须用plus.android.requestPermissions;MANAGE_EXTERNAL_STORAGE需原生跳转且仅限必要场景。

uni.authorize 申请 READ_MEDIA_IMAGES 失败?先确认 Android 版本和权限映射关系
Android 13(API 33)起,READ_EXTERNAL_STORAGE 不再覆盖图片访问——它被拆成独立权限:READ_MEDIA_IMAGES、READ_MEDIA_VIDEO、READ_MEDIA_AUDIO。直接沿用旧版 scope: 'scope.writePhotosAlbum' 或拼错权限名(比如写成 read_media_image 少个 s),都会静默失败或返回 false。
- 必须在
manifest.json的"app-plus" → "android" → "permissions"中显式声明:["READ_MEDIA_IMAGES", "READ_MEDIA_VIDEO"](注意是字符串数组,不是带android.permission.前缀的全名) -
uni.authorize的scope参数只接受逗号分隔的 scope 字符串,如'scope.writePhotosAlbum,scope.camera';但媒体文件权限不走scope.xxx,得用原生权限名 +plus.android.requestPermissions - 别在
onLaunch或onShow里无脑调用——用户还没点“选图”按钮就弹窗,大概率被拒,且触发“不再询问”后无法恢复
一加/华为等机型拒绝存储权限后,怎么跳转到“所有文件访问”设置页?
部分安卓 13+ 设备(尤其一加、华为新机型)对 READ_MEDIA_IMAGES 权限控制更严,即使已授权,仍可能因系统策略限制图片读取。此时需兜底申请 MANAGE_EXTERNAL_STORAGE(即“所有文件访问权限”),但它不能通过 uni.authorize 调用,必须用原生跳转。
- 先检测 SDK 版本:
const SDKVersion = uni.getSystemInfoSync().SDKVersion,仅当SDKVersion >= 33才走该流程 - 跳转代码必须用
plus.androidAPI:Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION,不能用plus.runtime.openSettings()(后者只开基础权限页) - 跳转前务必检查是否已被授予:
plus.android.isPermissionAuthorized('android.permission.MANAGE_EXTERNAL_STORAGE'),避免重复跳转干扰体验 - 注意:该权限在 Google Play 上架受限,仅限必要场景(如文件管理器类应用),普通图片选择应优先用
uni.chooseImage
为什么 uni.chooseImage 在安卓 13 上有时仍报错“无权限”?
uni.chooseImage 内部已做兼容,但它依赖底层系统相册组件——而某些厂商 ROM(如 ColorOS、EMUI)会拦截或重写该组件行为,导致回调失败或静默无响应。这不是你代码错了,而是系统层拦截了权限委托链。
- 确保 HBuilderX 升级到
4.87+(2026 年初已优化 Android 13 相册适配) - 禁用自定义基座(custom base)或确认其 SDK 已同步更新至支持 API 33 的版本
- 失败时不要立即重试,先用
plus.android.isPermissionAuthorized('android.permission.READ_MEDIA_IMAGES')检查真实状态,再决定是否引导用户手动开启 - 避免混用
uni.chooseImage和plus.gallery.pick——后者未适配分区存储,安卓 11+ 起基本不可用
manifest.json 配置 targetSdkVersion 是硬门槛,不是可选项
很多开发者以为只要代码里判断了版本就行,其实 targetSdkVersion 才是系统启用新权限模型的开关。若 manifest 中未设为 33 或更高,Android 13 设备仍按旧规则运行,反而导致行为不一致(比如本该弹 READ_MEDIA_IMAGES 却弹出已废弃的 READ_EXTERNAL_STORAGE)。
- 必须在
manifest.json的"app-plus" → "android"下配置:"targetSdkVersion": 33 - 同时删掉过时的
WRITE_EXTERNAL_STORAGE声明——它在 targetSdkVersion ≥ 33 后完全失效,留着反而引发审核警告 - 如果项目还依赖旧插件(如某些 PDF 预览、OCR 插件),需确认其 native 部分已适配 Scoped Storage,否则即使权限给了,文件路径也读不到内容
最常被忽略的一点:权限不是“申请了就能用”,而是“申请了 + 用户点了允许 + 系统真给了 + 插件/SDK 支持新路径”,四个环节缺一不可。尤其要注意厂商定制 ROM 对 MediaStore 查询的额外限制——有些机型即使权限开了,MediaStore.Images.Media.EXTERNAL_CONTENT_URI 也可能只返回空结果。










