uni-app怎么解决App端在安卓13/14下的存储权限 uni-app适配指南【解决】

星枫姑娘_9641

星枫姑娘_9641

2026-04-02

835人浏览

原创

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

uni-app怎么解决app端在安卓13/14下的存储权限 uni-app适配指南【解决】

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.android API: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 也可能只返回空结果。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2823

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

6163

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

7090

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6898

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

983

5

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

2026.11.03

0

18

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

2026.11.03

0

11

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

2026.11.03

0

11

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

2026.11.03

0

17

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习