“弱光增强”自动曝光模式

Android 15 引入了弱光增强自动曝光 (AE) 模式,这是一种新的自动曝光模式,可用于 Camera 2 和夜间模式相机扩展程序。弱光增强 AE 模式会在弱光条件下自动调整预览流的亮度。这与夜间模式相机扩展程序创建静态图片的方式不同,因为夜间模式会合并连拍照片,以创建一张经过增强的图片。虽然夜间模式非常适合创建静态图片,但它无法创建连续的帧流,而弱光增强 AE 模式可以。因此,弱光增强 AE 模式可实现新的相机功能,例如:

  • 提供增强的图片预览,以便用户更好地在弱光条件下拍摄照片。
  • 在光线较暗的环境中扫描二维码。

如果您启用弱光增强 AE 模式,该模式会在光线较暗时自动开启,并在光线较亮时自动关闭。

应用可以在弱光条件下从预览流中录制视频,以保存亮度增强的视频。

您可以在 Camera2 中或通过相机扩展程序使用弱光增强 AE 模式。本文档介绍了如何将弱光增强 AE 模式与 Camera2 搭配使用。如果设备支持,您还可以将弱光增强 AE 模式与夜间模式相机扩展程序搭配使用。

查看可用性

在使用弱光增强 AE 模式之前,请检查设备是否支持该模式。如果可用,弱光增强 AE 模式是 camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES 中列出的曝光模式之一。(弱光增强功能有自己的自动曝光设置,因为其他自动曝光设置与弱光增强 AE 模式执行的预览画面增亮功能不兼容。)

因此,如需检查弱光增强 AE 模式是否可用,请调用 CameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES),并检查返回的模式是否包含 ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY:

val characteristics = cameraManager.getCameraCharacteristics(cameraId)
val autoExposureModes =
    characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES)!!
val lowLightBoostSupported = autoExposureModes.contains(
    CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY
)

if (lowLightBoostSupported) {
    // Enable Low Light Boost AE Mode (next section).
} else {
    // Proceed without Low Light Boost AE Mode.
}

启用弱光增强 AE 模式

如需在 Camera2 会话中启用弱光增强 AE 模式,请将 CaptureRequest.CONTROL_AE_MODE 设置为 ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY。完成此操作后,您需要确认弱光增强 AE 模式已开启;您可以通过检查 CaptureResult.CONTROL_AE_MODE 字段来执行此操作。您需要进行检查,因为弱光增强功能并非与所有相机配置都兼容。例如,出于 FPS 方面的考虑,高速录制不支持弱光增强 AE 模式。如果弱光增强 AE 模式未开启,您可能需要更改相机配置,然后重试。

val captureRequestBuilder = camera.createCaptureRequest(
    CameraDevice.TEMPLATE_PREVIEW
)
if (isLowLightBoostAvailable(cameraId)) {
    captureRequestBuilder.set(
        CaptureRequest.CONTROL_AE_MODE,
        CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY
    )
}
// other capture request params.

session.setRepeatingRequest(
    captureRequestBuilder.build(),
    object : CaptureCallback() {
        override fun onCaptureCompleted(
            session: CameraCaptureSession,
            request: CaptureRequest,
            result: TotalCaptureResult
        ) {
            // verify Low Light Boost AE Mode AE mode set successfully.
            result.get(CaptureResult.CONTROL_AE_MODE) ==
                CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY
        }
    },
    cameraHandler
)

监控弱光增强 AE 模式

弱光增强 AE 模式会在弱光条件下调亮预览流,如果环境已经足够明亮,可以正常拍摄,则不会产生任何影响。您可以通过检查 CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE 字段来确认弱光增强 AE 模式当前是否处于启用状态。如果您已开启弱光增强 AE 模式且该模式当前处于启用状态,则该字段会设置为 CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE。然后,您可以显示月亮图标或一些其他指示,表明预览画面正在变亮。

session.setRepeatingRequest(
    captureRequestBuilder.build(),
    object : CaptureCallback() {
        override fun onCaptureCompleted(
            session: CameraCaptureSession,
            request: CaptureRequest,
            result: TotalCaptureResult
        ) {
            // check if Low Light Boost AE Mode is active or inactive.
            if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) ==
                CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE
            ) {
                // Low Light Boost AE Mode state is active.
                // Show Moon Icon.
            } else {
                // Low Light Boost AE Mode state is inactive or AE mode is not set
                // to Low Light Boost AE Mode.
                // Hide Moon Icon.
            }
        }
    },
    cameraHandler
)