app端无效,uni.createcameracontext().setzoom()在ios/android上不支持,调用会静默失败或报错;该方法仅部分h5浏览器可用,依赖mediastreamtrack.applyconstraints(),而app端未桥接原生camera sdk的zoom控制能力。

uni.createCameraContext().setZoom() 在 App 端是否有效
无效。App 端(iOS/Android)的 uni.createCameraContext() 不支持 setZoom() 方法,该 API 仅 H5 端部分浏览器可用,且依赖 MediaStreamTrack.applyConstraints(),而 App 端底层未桥接到原生 Camera SDK 的 zoom 控制能力。调用会静默失败或抛出 undefined is not a function 错误。
Android 原生插件中实现手动对焦的必要条件
必须使用 Camera2 API(非已弃用的 Camera1),并显式请求 CONTROL_AVAILABLE_EFFECTS 和 LENS_INFO_AVAILABLE_FOCAL_LENGTHS 等能力,否则即使代码写对,captureRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF) 也会被系统忽略。
- 目标 Android SDK 版本至少为 21(Android 5.0),低于此版本无 Camera2 支持
- 需在插件 Java 类中通过
CameraCharacteristics检查设备是否支持CONTROL_AVAILABLE_AFM_MODES,不支持则 fallback 到自动对焦 - 对焦距离参数单位是米(m),不是 0–1 或 1–10;常见可设范围为
0.1f(近距)到5.0f(远距),超出设备能力范围会触发onCaptureFailed
如何从 uni-app 向 Android 插件传入对焦距离值
不能直接传 float,必须转为整数毫秒级精度传递(避免 JS 浮点误差),再在 Java 层还原。例如:JS 端传 focusDistance: 800(表示 0.8 米),Java 端接收后除以 1000 得 0.8f。
- 插件 JS 接口定义示例:
cameraPlugin.focusAt({distance: 800}) - Java 端解析:
int distanceInt = json.optInt("distance", 0); float distance = distanceInt / 1000.0f; - 务必校验
distance是否在characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE)与MAXIMUM_FOCUS_DISTANCE范围内,否则 set 失败
为什么拍出来的图依然模糊?关键遗漏点
手动对焦 ≠ 立即生效。Camera2 要求你:先发送一个只含 AF 控制的 capture 请求(CONTROL_AF_TRIGGER_START),等待 CameraCaptureSession.CaptureCallback.onCaptureCompleted 回调后,再发带图像数据的正式 capture 请求。跳过 trigger 步骤,对焦参数不会被硬件执行。
- 常见错误:在
set()后直接takePicture(),结果仍是默认焦点 - 正确流程:AF trigger → wait for
CaptureResult.CONTROL_AF_STATE变为FOCUSED_LOCKED或NOT_FOCUSED_LOCKED→ 再拍照 - iOS 端无等效方案:WKWebView 不暴露 AVFoundation 的 focusDistance 控制,App 端 iOS 手动对焦目前不可行











