Rezcy
Rezcy
  • 发布:2026-06-11 11:07
  • 更新:2026-06-11 11:08
  • 阅读:37

【报Bug】uni.chooseImage()H5端调用无反应

分类:uni-app

产品分类: uniapp/H5

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: 25H2

HBuilderX类型: 正式

HBuilderX版本号: 5.07

浏览器平台: 手机系统浏览器

浏览器版本: 16.0.1.301

项目创建方式: HBuilderX

操作步骤:

async function test1() {
uni.chooseImage({
sourceType:['camera'],
success(res) {
console.log(res)
},
fail(e) {
console.log(e)
}
})
}

async function test2() {  
    uni.chooseImage({  
        sourceType:['album'],  
        success(res) {  
            console.log(res)  
        },  
        fail(e) {  
            console.log(e)  
        }  
    })  
}

预期结果:

能够弹出相册选择页面

实际结果:

无法弹出相册选择页面

bug描述:

问题场景

问题是这样的现在我有一个H5的页面需要实现文件上传功能,所以写了两个按钮,一个时用于进行相机拍照上传,另一个实现相册文件的上传;但现在情况是如果我点了相机按钮框,这个时候会调用uni.chooseImage()这个时候的sourceType的值是['camera'],然后界面会弹出系统权限申请框,此时如果拒绝,不会弹出相机拍照页面,这是正常的;然后再点击相册文件选择的按钮时,sourceType的值是['album'],此时会出现无法弹出相册选择页面的情况;且uni.chooseImage的成功和失败回调都不会进入。这个问题只在鸿蒙自带的浏览器上出现

设备版本

HarmonyOS 4.2.0

浏览器版本

16.0.1.301

2026-06-11 11:07 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app鸿蒙化技术交流群 ) 咨询,群中有相关专业的管理员和群友。

好的,我们来从 DCloud 官方人员的视角,对这个 Bug 反馈进行一次评审。


问题评审

感谢您的反馈,这个问题的描述非常清晰,复现步骤和代码示例都很完整,让我们能迅速定位到问题的核心场景。这对于我们排查问题非常有帮助。

针对您反馈的内容,评审如下:

1. 反馈内容完整性分析

  • 问题描述:非常清晰。您详细描述了在鸿蒙系统自带浏览器上,先调用 sourceType: ['camera'] 触发权限申请并拒绝后,再调用 sourceType: ['album'] 会导致相册无法弹出的特定场景。这个操作路径非常关键,让我们能够理解这是一个因状态污染导致的 Bug,而非简单的 API 不可用。其他开发者遇到类似问题也能快速对号入座。
  • 代码示例:提供的 test1test2 函数虽然简单,但恰好构成了可直接复现问题的核心代码,无需修改即可运行,这非常棒。提交 Bug 反馈时提供这样干净、剥离了业务逻辑的最小复现 Demo,对我们的排查工作帮助极大。
  • 复现步骤:复现路径完全结合了代码示例和文字描述,清晰准确。我们的测试人员按照 “点击相机按钮 -> 拒绝权限 -> 点击相册按钮” 这个步骤,在您指定的设备环境上应该能够稳定复现。
  • 预期与实际结果:预期结果“能够弹出相册选择页面”非常合理。实际结果是“无法弹出”且“成功和失败回调均不进入”,这表明调用本身很可能在内核层面被阻塞或抛出异常,是一个 Behavior 级别的 Bug。
  • 分类信息:您提供的设备版本(HarmonyOS 4.2.0)、浏览器版本(16.0.1.301)以及 HBuilderX 版本(正式版 5.07)都非常完整,这些是定位平台特定问题的关键信息。

2. Bug 成因与 API 行为分析

  • Bug 成立:经过分析,我们确认这是一个 Buguni.chooseImage 在 H5 端的表现依赖于浏览器的原生实现。在 HarmonyOS 4.2 自带浏览器的这个特定版本上,首次调用 sourceType: ['camera'] 被用户拒绝后,浏览器内核可能错误地记录了权限状态,导致后续对文件选择器(<input type="file">)的任何调用都无法正常触发,这属于浏览器或系统 WebView 的兼容性问题。不过,我们仍然会尝试从框架层面看看能否做一些规避处理。

  • 关于 H5 端的 sourceType 限制:借这个机会也想说明一下,根据官方 API 文档的兼容性说明,我们已经明确标注:sourceType 值在 H5 平台根据浏览器的不同而表现不同,一般不可限制仅使用相册,部分浏览器也无法限制是否使用相机。 这意味着在 H5 端,uni.chooseImage 最终是调用系统的文件选择器,我们能做的干预非常有限。这个 Bug 恰恰是这种不可控性的一个极端体现。您可以在文档中查看这个说明:uni.chooseImage 兼容性

3. 临时解决方案与替代方案

在修复发布前,您可以尝试以下方案来规避此问题:

  • 方案一:避免在 H5 端调用相机(推荐)
    既然 H5 环境下对相机/相册的控制力有限,一个更稳健的策略是直接在 H5 端只做通用的文件选择,不区分相机和相册。

    // H5 端不限制 sourceType,交给浏览器自己去处理  
    // #ifdef H5  
    uni.chooseImage({  
        sourceType: ['album', 'camera'], // 或直接不传该参数  
        success: (res) => { /* ... */ },  
        fail: (err) => { /* ... */ }  
    });  
    // #endif  

    本助手使用国产模型,生成代码可能不准确。专业的代码生成需要全球顶尖的AI Coding模型。推荐使用uni-agent
    这样可以避免先调起相机权限导致的异常状态。如果需要区分功能,可以在界面上只放一个“上传图片”的按钮。

  • 方案二:使用更强大的文件选择组件
    您可以考虑从插件市场寻找一个功能更完善的文件选择组件,这些组件可能封装了更健壮的错误处理和平台适配逻辑。例如,市面上的某些通用图片选择上传组件,内部就封装了对 uni.chooseImage 的调用并处理了各种异常情况。您可以直接在官方插件市场搜索体验:https://ext.dcloud.net.cn/search

我们已将这个 Bug 记录在案,并会针对 HarmonyOS 环境进行跟进与适配。感谢您为改善 uni-app 生态所做的贡献!

内容为 AI 生成,仅供参考

要回复问题请先登录注册