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
Kotlin
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 }
Java
CameraCharacteristics characteristics = mCameraManager.getCameraCharacteristics(cameraId); int[] autoExposureModes = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES); boolean 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 模式未开启,您可能需要更改相机配置并重试。
Kotlin
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 )
Java
CaptureRequest.Builder captureRequestBuilder = mCamera.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 mSession.setRepeatingRequest( captureRequestBuilder.build(), new CaptureCallback() { @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { // 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; } }, mCameraHandler );
监控弱光增强 AE 模式
弱光增强 AE 模式会在弱光环境下调亮预览流,如果环境光线已足够进行正常拍摄,它将不会产生任何影响。您可以通过检查 CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE 字段来确认弱光增强 AE 模式当前是否处于活动状态。如果您已开启弱光增强 AE 模式且该模式当前处于活动状态,该字段将设置为 CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE。此时,您可以显示一个月亮图标或其他指示器,告知用户预览画面正在进行增亮处理。
Kotlin
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 )
Java
mSession.setRepeatingRequest( captureRequestBuilder.build(), new CaptureCallback() { @Override public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) { // 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 } } }, mCameraHandler );