Utilizzare una sessione di aumento della luminosità

Utilizza una sessione di miglioramento in condizioni di scarsa illuminazione per attivare e disattivare Google Low Light Boost.

Kotlin

dependencies {
  val low_light_boost_version = "16.0.1-beta04"
  implementation("org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2")
  implementation("com.google.android.gms:play-services-base:18.7.0")
  implementation("com.google.android.gms:play-services-camera-low-light-boost:${low_light_boost_version}")
  implementation("com.google.android.gms:play-services-tasks:18.3.0")
}

Alla moda

dependencies {
  def low_light_boost_version = "16.0.1-beta04"
  implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-play-services:1.10.2'
  implementation 'com.google.android.gms:play-services-base:18.7.0'
  implementation 'com.google.android.gms:play-services-camera-low-light-boost:${low_light_boost_version}'
  implementation 'com.google.android.gms:play-services-tasks:18.3.0'
}

LowLightBoostSession è fornito dal pacchetto di Google Play Services com.google.android.gms.cameralowlight. Per informazioni su come accedere alle API di Google Play services, consulta la documentazione di Google Play services.

Creare un oggetto di callback

Quando crei la sessione di miglioramento in condizioni di scarsa illuminazione, devi passargli un oggetto che implementa l'interfaccia LowLightBoostCallback. Le funzioni di questo oggetto vengono chiamate quando la sessione viene disconnessa o eliminata. Il seguente codice mostra come creare un callback:

Kotlin

private fun createLowLightBoostCallback(): LowLightBoostCallback =
  object : LowLightBoostCallback() {
    override fun onSessionDestroyed() {
      Log.d(TAG, "onSessionDestroyed")
      lowLightBoostSession = null
    }

    override fun onSessionDisconnected(statusCode: Int) {
      Log.d(TAG, "onSessionDisconnected: error=$statusCode")
      lowLightBoostSession = null
    }
  }

Java

private LowLightBoostCallback createLowLightBoostCallback() {
  LowLightBoostCallback lowLightBoostCallback = new LowLightBoostCallback() {
    @Override
    public void onSessionDestroyed() {
      Log.d(TAG, "onSessionDestroyed");
      lowLightBoostSession = null;
    }

    @Override
    public void onSessionDisconnected(int statusCode) {
      Log.d(TAG, "onSessionCreationFailed: error=" + statusCode);
      lowLightBoostSession = null;
    }
  }
  return lowLightBoostCallback;
}

Punti chiave di questo codice

  • Questo codice definisce un metodo privato, createLowLightBoostCallback(), che crea l'oggetto di callback. Chiamerai questo metodo quando crei effettivamente la sessione di miglioramento in condizioni di scarsa illuminazione, come descritto in Creare una sessione.
  • Il callback viene chiamato quando la sessione viene disconnessa o eliminata. Non viene chiamato quando viene creata la sessione. Per verificare se la sessione è stata creata correttamente, esamina l'oggetto Task restituito da LowLightBoostClient.createSession.

Creare una sessione

Per creare una sessione in condizioni di scarsa illuminazione, chiama il metodo LowLightBoostClient.createSession.

Kotlin

val options = LowLightBoostOptions(
  previewSurface,
  cameraId,
  previewWidth,
  previewHeight,
  enableLowLightBoost
)

launch {
  try {
    val lowLightBoostSession = lowLightBoostClient
      .createSession(options, createLowLightBoostCallback()).await()

    Log.d(TAG, "Session created successfully")

    // Get the surface from the LLB session;
    // give it to camera so camera can write frames to it
  } catch (e: CancellationException) {
    Log.w(TAG, "Session creation was canceled", e)
    lowLightBoostSession = null
  } catch (e: ApiException) {
    Log.e(TAG, "Session creation failed with ApiException:", e)
    lowLightBoostSession = null
  } catch (e: Exception) {
    Log.e(TAG, "Session creation failed with Exception", e)
    lowLightBoostSession = null
  }
}

Java

LowLightBoostOptions options = new LowLightBoostOptions(
  previewSurface,
  cameraId,
  previewWidth,
  previewHeight,
  enableLowLightBoost);

lowLightBoostClient
  .createSession(options, createLowLightBoostCallback())
  .addOnSuccessListener(
    lowLightBoostExecutor,
    (session) -> {
      Log.d(TAG, "Session created successfully");

      // Get the surface from the LLB session;
      // give it to camera so camera can write frames to it

    })
  .addOnFailureListener(
    lowLightBoostExecutor,
    (e) -> {
      ApiException apiException = (ApiException) e;
      Log.d(TAG, "Session creation failed: " + e);
      lowLightBoostSession = null;
    })
  .addOnCompleteListener(
    lowLightBoostExecutor,
    (task) -> Log.d(TAG, "Session creation complete"))
  .addOnCanceledListener(
    lowLightBoostExecutor,
    () -> {
      throw new RuntimeException("Session creation canceled");
    });

Punti chiave di questo codice

  • Passa un LowLightBoostOptions oggetto a createSession() per configurare la sessione. Questo oggetto specifica elementi come la superficie di destinazione, l'ID della videocamera da utilizzare e le dimensioni dell'anteprima.
  • Questo codice presuppone che tu abbia già aperto una connessione a una videocamera Camera2, e che tu abbia utilizzato queste informazioni per impostare i valori di cameraId, previewWidth, previewHeight. Per saperne di più, consulta la documentazione di Camera2.
  • enableLowLightBoost è un valore booleano che specifica se il miglioramento in condizioni di scarsa illuminazione deve essere attivato o disattivato.
  • createLowLightBoostCallback è un metodo che scrivi per creare l'oggetto di callback. Questo oggetto viene chiamato quando la sessione viene disconnessa o eliminata.
  • Il metodo LowLightBoostClient.createSession() restituisce un Task oggetto. Utilizza questo oggetto per configurare i listener di successo e di errore. Acquisisci il video all'interno del listener di successo.
  • Puoi specificare un Executor per eseguire i listener. Se non specifichi un Executor, i listener vengono eseguiti sul thread principale. In questo codice, presupponiamo che lowLightBoostExecutor sia un Executor adatto.

Passare i risultati dell'acquisizione

Google Low Light Boost ha bisogno di determinati metadati della videocamera per conoscere la quantità corretta di luminosità da applicare. Devi passare TotalCaptureResult al processCaptureResult() metodo. Puoi ottenere TotalCaptureResult in il onCaptureCompleted() metodo di callback.

Kotlin

  val captureCallback = CameraCaptureSession.CaptureCallback() {
    override fun onCaptureCompleted(
      session: CameraCaptureSession,
      request: CaptureRequest,
      result: TotalCaptureResult
    ) {
      super.onCaptureCompleted(session, request, result)
      lowLightBoostSession?.processCaptureResult(result)
    }
  }

Java

  CameraCaptureSession.CaptureCallback captureCallback =
    new CameraCaptureSession.CaptureCallback() {
      @Override
      public void onCaptureCompleted(
        @NonNull CameraCaptureSession session,
        @NonNull CaptureRequest request,
        @NonNull TotalCaptureResult result) {
          super.onCaptureCompleted(session, request, result)
          if (lowLightBoostSession != null) {
            lowLightBoostSession.processCaptureResult(result);
          }
        }
      };

Punti chiave di questo codice

  • Questo codice mostra solo il codice CaptureCallback pertinente a Google LLB. Probabilmente avrai altro codice in questi callback.
  • Il passaggio di TotalCaptureResult consente a Google LLB di analizzare i dati di esposizione automatica e altri metadati necessari per il miglioramento in condizioni di scarsa illuminazione per elaborare il rilevamento della scena e determinare la quantità di miglioramento da applicare al frame.
  • Devi passare l'oggetto captureCallback quando crei la sessione della videocamera, ad esempio con `setSingleRepeatingRequest().
consulta la guida all'interoperabilità di CameraX con Camera2.

Avviare l'anteprima della videocamera

Dopo aver creato una sessione in condizioni di scarsa illuminazione, puoi avviare lo stream di anteprima della videocamera. Devi farlo all'interno del onSuccess() callback che passi alla sessione in condizioni di scarsa illuminazione, come descritto in Creare una sessione. Il seguente codice mostra come acquisire video:

Kotlin

MainActivity.this.lowLightBoostSession =
  lowLightBoostSession
MainActivity.this.lowLightBoostSession
  .setSceneDetectorCallback(
    (lowLightBoostSession, boostStrength) -> {
      Log.d(TAG, "onSceneBrightnessChanged: " +
        "boostStrength=$boostStrength")
      // boostStrength > 0.5 indicates a low light scene.
      // Update UI accordingly.
    },
    lowLightBoostExecutor
  )
try {
  startCaptureSession(
    lowLightBoostSession.getCameraSurface())
    // Start a Camera2 session here. Pass the LLB surface
    // to the camera so the camera can write frames to it.
} catch (e: CameraAccessException) {
  Log.e(TAG, "Failed to start capture session", e)
  // Must try again or start the capture session without LLB.
}

Java

MainActivity.this.lowLightBoostSession =
  lowLightBoostSession;
MainActivity.this.lowLightBoostSession
  .setSceneDetectorCallback(
    (lowLightBoostSession, boostStrength) -> {
      Log.d(TAG, "onSceneBrightnessChanged: " +
        "boostStrength=" + boostStrength);
      // boostStrength > 0.5 indicates a low light scene.
      // Update UI accordingly.
    },
    lowLightBoostExecutor
  );
try {
  startCaptureSession(
    lowLightBoostSession.getCameraSurface());
    // Start a Camera2 session here. Pass the LLB surface
    // to the camera so the camera can write frames to it.
} catch (CameraAccessException e) {
  Log.e(TAG, "Failed to start capture session", e);
  // Must try again or start the capture session without LLB.
}

Punti chiave di questo codice

Rilasciare la sessione

Quando la videocamera non è più attiva, rilascia la sessione di miglioramento in condizioni di scarsa illuminazione chiamando LowLightBoostSession.release(). In particolare, devi assicurarti di rilasciare la sessione quando la tua attività viene eliminata. Puoi farlo chiamando il metodo nel metodo onDestroy() della tua attività:

Kotlin

override protected void onDestroy() {
  super.onDestroy()
  if (lowLightBoostSession != null) {
    lowLightBoostSession.release()
    lowLightBoostSession = null
  }
}

Java

@Override
protected void onDestroy() {
  super.onDestroy();
  if (lowLightBoostSession != null) {
    lowLightBoostSession.release();
    lowLightBoostSession = null;
  }
}

Punti chiave di questo codice

  • Dopo aver rilasciato la sessione, non devi chiamare nessuno dei suoi metodi. Devi cancellare tutte le variabili che puntano alla sessione, come fa questo codice.