uni.chooseimage无法手动对焦,因其调用系统相机界面且不暴露对焦参数;需改用组件配合plus.camera原生api(仅app端),通过setoptions设置focusmode为manual并调用startpreview后方可生效。

uni.chooseImage 无法手动对焦,别白费劲
uni.chooseImage 在 App 端调起的是系统相机界面,其对焦逻辑完全由 Android/iOS 原生相册应用控制,uni.chooseImage API 不暴露任何对焦参数(如 focusMode、pointOfInterest),也无回调通知对焦状态。你看到的“点击屏幕对焦”是系统行为,无法在 JS 层干预或触发。
要用 manual focus,必须用 组件 + plus.camera(仅 App)
App 端唯一可控对焦的方式,是弃用 uni.chooseImage,改用 <camera></camera> 组件配合 plus.camera 原生 API —— 它允许设置对焦模式和触点坐标,但仅限 5+ SDK(即 App 端),H5 和小程序完全不支持。
实操要点:
- 页面中必须声明
<camera device-position="back" style="width:100%;height:100vh;"></camera>,且不能嵌套在条件渲染或 view 中(小程序会白屏,App 虽不报错但可能初始化失败) - 在
onReady或onShow中调用plus.camera.getCamera()获取原生 camera 实例 - 调用
camera.setOptions({focusMode: 'manual', manualFocusDistance: 0.2})设置手动对焦距离(单位米,范围通常 0.1~无穷远,具体上限需plus.camera.getSupportedOptions()查询) - 若需“点击屏幕对焦”,需监听
touchstart,换算坐标后调用camera.focusAtPoint(x, y)(注意:x/y 是归一化坐标,0~1) - 拍照仍用
camera.captureImage(),不是uni.createCameraContext().takePhoto()—— 后者不支持 manual focus
Android 上 manualFocusDistance 兼容性极差
很多中低端 Android 设备(尤其联发科平台、旧版 MIUI/EMUI)根本不支持手动对焦参数,setOptions 会静默失败,getSupportedOptions() 返回空或不含 manualFocusDistance。不要假设所有机型都可用。
稳妥做法:
- 先调
plus.camera.getSupportedOptions(),检查返回对象是否含focusModes且包含'manual' - 再尝试
setOptions({focusMode: 'manual'}),用fail回调兜底回退到'auto' - 避免硬编码
manualFocusDistance: 0.3,应根据设备能力动态设值,或让用户滑动调节(需自己实现 UI) - 测试务必覆盖华为 P30/P40、小米 12、OPPO Reno8、vivo X90 等主流机型,别只信模拟器
别混淆 uni.createCameraContext 和 plus.camera
uni.createCameraContext() 是跨平台封装层,只支持基础拍照/录像,对焦完全不可控;plus.camera 是 5+ SDK 原生能力,仅 App 可用,但能真正干预硬件。两者不能混用 —— 你在同一个页面里既写 <camera></camera> 又调 plus.camera.getCamera() 没问题,但千万别试图用 uni.createCameraContext() 去操作 plus.camera 实例。
最容易被忽略的一点:手动对焦生效的前提是相机已预览(camera.startPreview() 成功),而 <camera></camera> 组件本身不自动调用该方法,必须显式调用。漏掉这步,setOptions 会返回 “camera not ready” 错误。











