Utilizzare una sessione di aumento della luminosità

Utilizza una sessione di miglioramento in condizioni di scarsa illuminazione per attivare e disattivare la funzionalità di Google.

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")
}

Groovy

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 com.google.android.gms.cameralowlight di Google Play Services. Consulta la documentazione di Google Play Services per informazioni sull'accesso alle API di Google Play Services.

Creare un oggetto di callback

Quando crei la sessione di potenziamento in condizioni di scarsa illuminazione, devi passare un oggetto che implementa l'interfaccia LowLightBoostCallback. Le funzioni di questo oggetto vengono chiamate quando la sessione viene disconnessa o distrutta. 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 callback. Chiamerai questo metodo quando crei effettivamente la sessione di potenziamento 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 oggetto LowLightBoostOptions 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 ulteriori informazioni, consulta la documentazione di Camera2.
  • enableLowLightBoost è un valore booleano che specifica se l'ottimizzazione in condizioni di scarsa illuminazione deve essere attivata o disattivata.
  • createLowLightBoostCallback è un metodo che scrivi per creare l'oggetto callback. Questo oggetto viene chiamato quando la sessione viene disconnessa o eliminata.
  • Il metodo LowLightBoostClient.createSession() restituisce un oggetto Task. Utilizzi questo oggetto per configurare i listener di esito positivo e negativo. 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, supponiamo che lowLightBoostExecutor sia un Executor adatto.

Superato nei risultati dell'acquisizione

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

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.
  • L'inserimento di TotalCaptureResult consente a Google LLB di analizzare i dati di esposizione automatica e altri metadati necessari per il potenziamento in condizioni di scarsa illuminazione per elaborare il rilevamento della scena e determinare la quantità di potenziamento da applicare al frame.
  • Devi passare l'oggetto captureCallback quando crei la sessione della videocamera, ad esempio con `setSingleRepeatingRequest().

Avviare l'anteprima della videocamera

Una volta creata una sessione in condizioni di scarsa illuminazione, puoi avviare lo stream dell'anteprima della videocamera. Devi farlo all'interno del callback onSuccess() 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, termina la sessione di ottimizzazione in condizioni di scarsa illuminazione chiamando il numero 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 il rilascio della sessione, non devi chiamare nessuno dei suoi metodi. Devi cancellare tutte le variabili che puntano alla sessione, come fa questo codice.