Android 15 では、新しい自動露出モードであるローライト ブーストが導入されています。これは、カメラ 2 と夜間モードのカメラ拡張機能の両方で使用できます。ローライト ブーストは、暗い場所でプレビュー ストリームの明るさを自動的に調整する機能です。これは、夜間モードのカメラ拡張機能による静止画像の作成とは異なります。夜間モードでは、一連の写真を結合して 1 つの補正された画像を作成するためです。夜間モードは静止画像の作成には非常に適していますが、フレームの連続ストリームを作成することはできませんが、ローライト ブーストは作成できます。そのため、ローライト ブーストにより、次のような新しいカメラ機能が有効になります。
- 強化された画像プレビューを提供することで、ユーザーが暗い場所で撮影した写真をより適切にフレームに収めることができます。
- 暗い場所で QR コードをスキャンしています。
ローライト ブーストを有効にすると、光量が不足すると自動的にオンになり、光量が増加するとオフになります。
アプリは、暗い場所でプレビュー ストリームから録画して、明るい動画を保存できます。
ローライト ブーストは、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 );