Android 15 推出了低光源增強,這項新的自動曝光模式適用於相機 2 和夜間模式的相機擴充功能。低光源增強功能會在低光源環境時自動調整預覽串流的亮度。這與夜間模式相機擴充功能製作靜態圖片的方式不同,因為夜間模式會合併多張相片,建立修飾的單一相片。雖然夜間模式非常適合用來建立靜態圖像,但無法建立連續影格串流,但低光源模式具有此功能。因此,低光源增強功能可提供新的相機功能,例如:
- 提供強化的圖片預覽,讓使用者更容易在低光源環境中拍出影格。
- 正在低光源環境掃描 QR code。
如果啟用低光源增強功能,系統會在低光源環境時自動開啟此功能,並在光線充足時關閉。
應用程式可以在低光源環境下錄製預覽串流,以儲存經過模糊處理的影片。
您可以在 Camera2 或相機擴充功能中使用低光源增強功能。本文說明如何將低光源增強功能與 Camera2 搭配使用。如果裝置支援夜間模式相機擴充功能,也可以搭配使用低光源增強功能。
查詢空房
使用低光源增強功能前,請先確認裝置是否支援這項設定。如有可用,低光源增強功能是 camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES
中列出的其中一種曝光模式。(「低光源強化」是專屬的自動曝光設定,因為其他自動曝光設定與低光源增強功能執行的預覽亮度不相容)。
因此,如要檢查低光源增強功能是否可用,請呼叫 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 (next section) } else { // Proceed without Low Light Boost }
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 (next section) } else { // Proceed without Low Light Boost }
啟用低光源增強功能
如要在 Camera2 工作階段中啟用低光源增強功能,請將 CaptureRequest.CONTROL_AE_MODE
設為 ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY
。執行此操作後,您需要確認低光源增強功能已開啟 (請查看 CaptureResult.CONTROL_AE_MODE
欄位)。因為低光源增強功能與某些相機設定不相容,所以需要進行確認。舉例來說,基於 FPS 的考量,高速錄影不支援低光源強化功能。如果未開啟低光源增強功能,您可能需要變更相機設定,然後再試一次。
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 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 set successfully result.get(CaptureResult.CONTROL_AE_MODE) == CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY; } }, mCameraHandler );
監視低光源模式
低光源增強功能會在低光源環境下提高預覽串流亮度;如果環境的亮度已足以進行一般拍攝,就不會有任何效果。如要確認低光源增強功能目前是否處於啟用狀態,請查看 CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE
欄位。如果您已開啟低光源增強功能,且目前正在使用中,欄位會設為 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 is active or inactive if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) == CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) { // Low Light Boost state is active // Show Moon Icon } else { // Low Light Boost state is inactive or AE mode is not set // to Low Light Boost // 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 is active or inactive if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) == CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) { // Low Light Boost state is active // Show Moon Icon } else { // Low Light Boost state is inactive or AE mode is not set // to Low Light Boost // Hide Moon Icon } } }, mCameraHandler );