Aumento luce

Android 15 introduce la funzionalità Migliora Luce scarsa, una nuova modalità di esposizione automatica disponibile sia per la Fotocamera 2 che per l'estensione della fotocamera in modalità notturna. L'opzione Low Light Boost regola automaticamente la luminosità dello stream in anteprima in condizioni di scarsa illuminazione. Questo processo è diverso da quello che l'estensione della fotocamera per la modalità notturna crea immagini fisse, perché la modalità notturna combina una serie di foto a raffica per creare un'unica immagine migliorata. Sebbene la modalità notturna funzioni molto bene per creare un'immagine statica, non è in grado di creare un flusso continuo di fotogrammi, a differenza di Low Light Boost. Pertanto, Low Light Boost consente di utilizzare nuove funzionalità della fotocamera, come le seguenti:

  • Fornire un'anteprima migliorata delle immagini, in modo che gli utenti possano inquadrare meglio le immagini in condizioni di scarsa illuminazione.
  • Scansione dei codici QR in condizioni di scarsa illuminazione.

Se attivi Low Light Boost, la funzionalità si accende automaticamente quando c'è poca luce e si spegne quando c'è più luce.

Le app possono registrare durante lo streaming dell'anteprima in condizioni di scarsa illuminazione per salvare un video con luminosità maggiore.

Puoi usare questa funzionalità in Fotocamera2 o tramite le estensioni videocamera. Questo documento spiega come utilizzare la funzionalità Migliora luce scarsa con Fotocamera2. Puoi anche utilizzare la funzionalità Low Light Boost con l'estensione della videocamera per la modalità notturna, se è supportata dal dispositivo.

Verifica la disponibilità

Prima di usare l'opzione Low Light Boost, verifica che sia supportata sul dispositivo. Se è disponibile, Luce scarsa è una delle modalità di esposizione elencate in camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES. (L'impostazione Amplificazione luce scarsa è impostata per l'esposizione automatica a sua volta, poiché le altre impostazioni di esposizione automatica non sono compatibili con la luminosità di anteprima eseguita da Amplificazione luce scarsa).

Quindi, per controllare se la funzionalità Low Light Boost è disponibile, chiama CameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES) e controlla se le modalità restituite includono 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
}

Attiva luminosità scarsa

Per attivare Low Light Boost in una sessione Fotocamera2, imposta CaptureRequest.CONTROL_AE_MODE su ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY. Dopodiché dovrai confermare che l'opzione Low Light Boost è stata attivata. Per farlo, controlla il campo CaptureResult.CONTROL_AE_MODE. Controlla, perché l'impostazione Booster luce scarsa non è compatibile con tutte le configurazioni della fotocamera. Ad esempio, la registrazione ad alta velocità non supporta la funzionalità Low Light Boost, a causa di considerazioni relative agli f/s. Se la funzionalità Low Light Boost non è attiva, potrebbe essere necessario cambiare la configurazione della videocamera e riprovare.

Kotlin

val captureRequestBuilder = camera.createCaptureRequest(
  CameraDevice.TEMPLATE_PREVIEW)
if (isLowLightBoostAvailable(cameraId)) {
  captureRequestBuilder.set(
    CaptureRequest.CONTROL_AE_MODE,
    CaptureMetadata.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) ==
          CaptureMetadata.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
);

Monitora luminosità scarsa

L'ottimizzazione Luce scarsa illumina lo stream di anteprima in condizioni di scarsa illuminazione e non ha alcun effetto se l'ambiente è già sufficientemente luminoso per l'acquisizione normale. Puoi verificare se la funzionalità Low Light Boost è attualmente attiva controllando il campo CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE. Se hai attivato l'opzione Amplificazione luce scarsa e la funzionalità è al momento attiva, il campo è impostato su CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE. Potresti quindi mostrare un'icona a forma di luna o un'altra indicazione che l'anteprima è in aumento.

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) ==
        CaptureMetadata.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) ==
        CaptureMetadata.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
);