在 Android 14 引入了 READ_MEDIA_VISUAL_USER_SELECTED(选择性相册访问)机制后,UniApp 原生基座在处理“部分授权”时存在三个严重的兼容性 Bug:
Bug 1:plus.android.requestPermissions 回调状态完全错误
复现步骤:
代码中调用 plus.android.requestPermissions(['android.permission.READ_MEDIA_IMAGES', 'android.permission.READ_MEDIA_VIDEO'])。
系统弹出授权框,用户点击“选择照片和视频”(即部分授权)。
检查回调参数 resultObj。 实际结果: resultObj.granted 数组为空!而 READ_MEDIA_IMAGES 和 READ_MEDIA_VIDEO 竟然被全部塞进了 resultObj.deniedAlways 中! 期望结果: 用户既然授予了部分访问权,底层 API 应该将对应的媒体权限返回至 granted 数组,或者在业务逻辑上提供明确的“部分授权”状态标识,而不是简单粗暴地按“永久拒绝 (deniedAlways)”处理,这会导致前端拦截器严重误判。
Bug 2:在部分授权模式下,再次调用 uni.chooseVideo 视频丢失
复现步骤:
用户在首次权限申请中选择了“部分授权”,并在系统的 Photo Picker 中同时勾选了照片和视频。
再次调用 uni.chooseVideo。 实际结果: 系统不再拉起原生的 Photo Picker(因为已处于部分授权态),UniApp 似乎走了自己内部的 MediaStore 查询兜底逻辑。但该查询无法查出用户刚才授权过的视频文件,导致界面上只显示了图片,视频凭空消失。 期望结果: 在部分授权模式下,uni.chooseVideo 的内部 MediaStore 查询应当能正确读取并展示被临时授权的视频文件 URI。
Bug 3:权限从“部分”升级为“全部”后,uni.chooseVideo 列表变空
复现步骤:
用户原本处于“部分授权”状态。
用户在系统设置中,手动将相册权限改为“允许全部访问”。
再次回到 App 并调用 uni.chooseVideo。 实际结果: 选择器打开后列表完全为空(图片和视频都没了)。只有重新关闭再打开权限才能恢复正常。 期望结果: UniApp 底层的 MediaStore 查询应当处理好 ContentResolver 的生命周期/缓存。当权限状态发生变更时,内部应当主动刷新缓存,而不是返回空列表。
2 个回复
Ask小助手
感谢您提交的 Bug 反馈。您反馈的问题描述非常详细,对 Android 14 引入的
READ_MEDIA_VISUAL_USER_SELECTED(选择性相册访问)机制在 UniApp 中的兼容性分析得十分透彻。以下是对该 Bug 反馈的评审与分析意见:1. Bug 反馈内容完整性分析
整体评价:
反馈内容结构完整,包含了 Bug 标题、详细描述、复现步骤、预期结果、实际结果以及完整的分类信息。描述逻辑清晰,官方人员能够完全看懂并理解业务场景。
具体检查意见:
plus.android.requestPermissions和uni.chooseVideo的逻辑,但缺少可直接运行复现的工程示例代码。为了确保官方工程师能够快速、精准地复现问题,建议您补充一个最小化的可运行代码片段(包含权限申请和选择视频的调用逻辑)。2. Bug 是否成立及分析
根据现有资料,Android 14 确实引入了
READ_MEDIA_VISUAL_USER_SELECTED权限以支持“部分访问”相册。针对您反馈的三个 Bug,分析如下:关于 Bug 1(requestPermissions 回调状态错误):
从 Android 原生机制来看,当用户选择“部分授权”时,系统实际上会授予
READ_MEDIA_VISUAL_USER_SELECTED权限,而READ_MEDIA_IMAGES和READ_MEDIA_VIDEO处于未授权状态。UniApp 底层的plus.android.requestPermissions在处理这种混合状态时,将其直接映射到了deniedAlways(永久拒绝)中,这在业务逻辑上确实会导致前端拦截器误判为“权限被永久拒绝”。该 Bug 现象成立,底层在状态映射处理上存在优化空间。关于 Bug 2 与 Bug 3(chooseVideo 列表异常):
在 Android 14 “部分授权”模式下,应用通过
MediaStore查询媒体文件时,只能查询到用户手动勾选的那部分媒体 URI。您反馈的“视频凭空消失”以及“权限升级后列表变空”现象,高度疑似 UniApp 原生基座在处理MediaStore查询时的过滤条件未正确适配部分授权状态,或者ContentResolver的生命周期/缓存在权限状态变更时未得到有效刷新。这些现象均指向框架底层的兼容性缺陷。替代方案与建议:
在官方修复该底层适配问题之前,建议您在业务层进行规避或尝试以下方案:
uni.chooseMedia替代uni.chooseVideo:根据官方文档说明,安卓的uni.chooseMedia目前采用的是系统Picker的形式去获取文件,这种方式受系统权限策略影响较小,可能更适合在复杂的授权场景下选择图片和视频。您的反馈非常有价值,我们将把此问题转交至底层引擎研发团队进行进一步排查与适配评估。建议您在补充可复现的代码示例后,以便官方更高效地跟进处理。
ZiorPark (作者)
运行指南:
1.将上述代码粘贴至任意空白的 uni-app (Vue3) 项目的页面中。
2.使用 Android 14 测试机进行真机基座运行。
3.点击按钮 1,在弹出的系统权限框中选择“选择照片和视频”(部分访问),即可复现 Bug 1。
4.点击按钮 2,观察弹出的媒体列表,即可复现 Bug 2;随后去系统设置将权限升级为“全部访问”,再返回 App 点击按钮 2,即可复现 Bug 3。
要回复问题请先登录或注册
公告
更多>相关问题