Używanie sesji ze wzmocnieniem w słabym oświetleniu

Używaj sesji wzmocnienia w słabym oświetleniu, aby włączać i wyłączać funkcję Google Low Light Boost.

Kotlin

dependencies {
  val low_light_boost_version = "16.0.0-beta01"
  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.0-beta01"
  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 jest udostępniany w ramach pakietu com.google.android.gms.cameralowlight Usługi Google Play. Więcej informacji o dostępie do interfejsów API Usług Google Play znajdziesz w dokumentacji Usług Google Play.

Tworzenie obiektu wywołania zwrotnego

Podczas tworzenia sesji wzmocnienia w warunkach słabego oświetlenia musisz przekazać obiekt, który implementuje interfejs LowLightBoostCallback. Funkcje tego obiektu są wywoływane, gdy sesja zostanie rozłączona lub zniszczona. Ten kod pokazuje, jak utworzyć wywołanie zwrotne:

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

Najważniejsze informacje o tym kodzie

  • Ten kod definiuje prywatną metodę createLowLightBoostCallback(), która tworzy obiekt wywołania zwrotnego. Wywołujesz tę metodę, gdy tworzysz sesję wzmocnienia w warunkach słabego oświetlenia, zgodnie z opisem w sekcji Tworzenie sesji.
  • Wywołanie zwrotne jest wywoływane, gdy sesja zostanie rozłączona lub zniszczona. Nie jest wywoływana podczas tworzenia sesji. Aby sprawdzić, czy sesja została utworzona, sprawdź obiekt Task zwrócony przez LowLightBoostClient.createSession.

Tworzenie sesji

Aby utworzyć sesję w trybie słabego oświetlenia, wywołaj metodę 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");
    });

Najważniejsze informacje o tym kodzie

  • Do obiektu createSession() przekazujesz obiekt LowLightBoostOptions, aby skonfigurować sesję. Ten obiekt określa takie elementy jak docelowa powierzchnia, identyfikator kamery do użycia oraz wymiary podglądu.
  • Ten kod zakłada, że masz już otwarte połączenie z aparatem Camera2 i używasz tych informacji do ustawiania wartości cameraId, previewWidth, previewHeight. Więcej informacji znajdziesz w dokumentacji Camera2.
  • enableLowLightBoost to wartość logiczna określająca, czy funkcja wzmocnienia w warunkach słabego oświetlenia powinna być włączona, czy wyłączona.
  • createLowLightBoostCallback to metoda, którą piszesz, aby utworzyć obiekt wywołania zwrotnego. Ten obiekt jest wywoływany, gdy sesja zostanie rozłączona lub zniszczona.
  • Metoda LowLightBoostClient.createSession() zwraca obiekt Task. Używasz tego obiektu do konfigurowania odbiorników sukcesu i błędu. Nagrywaj film w obiekcie success listener.
  • Możesz podać Executor, aby uruchomić odbiorców. Jeśli nie określisz parametru Executor, odsłuchi będą działać w wątku głównym. W tym kodzie załóżmy, że lowLightBoostExecutor jest odpowiednim Executor.

Uruchom podgląd z aparatu

Po utworzeniu sesji w przyciemnionym pomieszczeniu możesz rozpocząć transmisję podglądu kamery. Należy to zrobić w ramach wywołania zwrotnego onSuccess() przekazywanego do sesji w warunkach słabego oświetlenia, zgodnie z opisem w artykule Tworzenie sesji. Poniższy kod pokazuje, jak nagrywać film:

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.
}

Najważniejsze informacje o tym kodzie

Zakończ sesję

Gdy kamera przestanie być aktywna, zakończ sesję wzmocnienia w warunkach słabego oświetlenia, wywołując LowLightBoostSession.release(). W szczególności musisz pamiętać o zwolnieniu sesji po zakończeniu działania. Możesz to zrobić, wywołując metodę onDestroy() w swojej aktywności:

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

Najważniejsze informacje o tym kodzie

  • Po zakończeniu sesji nie należy wywoływać żadnej z jej metod. Należy usunąć wszystkie zmienne wskazujące na sesję, tak jak to robi ten kod.