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
相关产品推荐
相关产品推荐

