安卓Camera API关闭闪光灯后预览变黑问题求解
问题根因
你遇到的预览变暗问题,完全是关闭闪光灯时的AE模式配置错误导致的:
- 相机初始启动预览时,默认开启自动曝光(AE),系统会实时根据环境光线调整ISO、曝光时长、增益等参数,保证预览亮度正常。
- 你在关闭闪光灯时将
CaptureRequest.CONTROL_AE_MODE设为CONTROL_AE_MODE_OFF,相当于直接关闭了自动曝光功能,相机会停止参数调整,直接沿用开启闪光灯时适配强光环境的低曝光参数。回到普通环境光下,低曝光参数进光量不足,自然就会出现预览发黑偏暗的问题。
修复方案
核心原则:闪光灯常亮(TORCH)模式的开关,不需要关闭自动曝光,关闭闪光灯时只需要把FLASH_MODE设为OFF,同时把AE模式恢复到初始预览的默认状态即可,不要设置为AE_OFF。
修正后的实现代码如下:
// 记录相机预览初始的AE模式,默认初始化预览时一般用CONTROL_AE_MODE_ON private final int DEFAULT_PREVIEW_AE_MODE = CaptureRequest.CONTROL_AE_MODE_ON; private void toggleFlash() { try { if (!flashOn) { // 开启闪光灯常亮 captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH); captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON); } else { // 关闭闪光灯,恢复默认自动曝光,禁止设置为CONTROL_AE_MODE_OFF captureRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF); captureRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, DEFAULT_PREVIEW_AE_MODE); } captureSession.setRepeatingRequest(captureRequestBuilder.build(), null, handler); flashOn = !flashOn; } catch (CameraAccessException e) { e.printStackTrace(); } }
补充优化点
- 如果你在相机初始化预览时自定义过AE模式(比如开启了自动闪光
CONTROL_AE_MODE_ON_AUTO_FLASH),把DEFAULT_PREVIEW_AE_MODE替换为你初始化时使用的AE值即可,保证关闭闪光灯后AE回到开启前的工作状态。 - 部分机型切换后自动曝光收敛速度慢,可以在关闭闪光灯的请求参数中额外加一行
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER, CaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER_IDLE),重置AE触发状态,加快曝光参数调整速度。 CONTROL_AE_MODE_OFF是全手动曝光模式,仅在你需要自己手动设置ISO、曝光时长等参数时使用,普通预览、拍照场景不要随意设置该值。
内容的提问来源于stack exchange,提问作者KANAYO AUGUSTIN UG
相关产品推荐
相关产品推荐

