You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Camera2部分设备(如三星S8)CONTROL_MODE_OFF下FLASH_MODE_TORCH不生效问题

问题根因

三星Galaxy S8等部分定制ROM的相机硬件抽象层(HAL)存在私有逻辑,当FLASH_MODE_TORCH被配置时,会强制恢复自动曝光流程,仅设置CONTROL_MODE_OFF无法覆盖该逻辑,导致手动设置的ISO、曝光时间参数失效。调用setTorchMode报错属于系统正常限制:该接口需要相机硬件处于空闲状态才能调用,和你已获取的CameraDevice实例硬件占用互斥。

可行解决方案

  • 补充双关闭逻辑,调整参数设置顺序
    仅设置CONTROL_MODE_OFF对部分三星机型不生效,需要额外显式配置CONTROL_AE_MODE_OFF,同时将手电筒参数的设置放到所有控制类参数之前,优先触发手动控制逻辑覆盖厂商默认逻辑。修改后代码示例如下:
captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
// 优先设置手电筒模式
captureBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
// 显式关闭自动控制+自动曝光双保险
captureBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_OFF);
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_OFF);
// 其余参数保持不变
captureBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range(Framerate, Framerate));
captureBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, characteristics.get(CameraCharacteristics.LENS_INFO_MINIMUM_FOCUS_DISTANCE));
captureBuilder.set(CaptureRequest.SENSOR_EXPOSURE_TIME, 100000L);
captureBuilder.set(CaptureRequest.SENSOR_FRAME_DURATION, 66666666L);
captureBuilder.set(CaptureRequest.SENSOR_SENSITIVITY, 1000);
captureBuilder.addTarget(imageReader.getSurface());
mCaptureSession.setRepeatingRequest(captureBuilder.build(), callback, null);
  • 改用手动模板创建捕获请求
    将创建CaptureRequest的模板从CameraDevice.TEMPLATE_PREVIEW替换为CameraDevice.TEMPLATE_MANUAL,该模板会明确告知HAL层当前需要全手动控制传感器参数,优先级高于厂商内置的手电筒触发逻辑。

  • 分阶段配置捕获请求
    先创建不带手电筒配置的重复请求,待捕获回调中连续2-3次返回的SENSOR_SENSITIVITY符合预期值后,再重新构建携带FLASH_MODE_TORCH参数的CaptureRequest,调用setRepeatingRequest更新捕获配置。该方案避开了初始化阶段参数冲突时厂商逻辑优先级更高的限制。

  • 三星机型特殊适配
    对三星品牌设备做单独适配,配置参数时额外添加captureBuilder.set(CaptureRequest.CONTROL_AE_LOCK, true),锁定自动曝光状态,避免手电筒触发自动曝光调节。

内容的提问来源于stack exchange,提问作者N3sh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 16:15:03