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

安卓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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:54:37