低光源增強

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
);