Android 15 推出了低光增強自動曝光 (AE) 模式,這是可用於 Camera 2 和夜間模式相機擴充功能的新自動曝光模式。在低光源環境中,低光源強化 AE 模式會自動調整預覽串流的亮度。這與夜間模式相機擴充功能建立靜態圖片的方式不同,因為夜間模式會結合一系列相片,建立單一經過強化的圖片。雖然夜間模式非常適合用於拍攝靜態影像,但無法建立連續的畫面串流,而低光增強 AE 模式則可以。因此,低光增強 AE 模式可啟用新的相機功能,例如:
- 提供強化的圖片預覽功能,方便使用者在低光源環境下拍攝相片。
- 在光線不足的環境中掃描 QR code。
如果啟用低光源增強 AE 模式,系統會在光線較暗時自動開啟,並在光線較強時關閉。
應用程式可以在低光源環境下錄製預覽串流,以便儲存經過調亮的影片。
您可以在 Camera2 或透過相機擴充功能使用低光源強化 AE 模式。本文將說明如何在 Camera2 中使用低光源強化 AE 模式。如果裝置支援夜間模式相機擴充功能,您也可以搭配使用低光源強化自動曝光模式。
檢查可用性
使用低光源強化自動曝光模式前,請先確認裝置是否支援這項功能。如果可用,低光增強 AE 模式會是 camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES
中列出的曝光模式之一。(低光增強功能有其專屬的自動曝光設定,因為其他自動曝光設定與低光增強 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 模式,且目前處於啟用狀態,則欄位會設為 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 );