Sitzung mit Modus für wenig Licht verwenden

Mit einer Sitzung für den Modus für wenig Licht können Sie den Modus für wenig Licht von Google aktivieren und deaktivieren.

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 wird vom Paket „Google Play-Dienste“ com.google.android.gms.cameralowlight bereitgestellt. In der Dokumentation zu den Google Play-Diensten finden Sie Informationen zum Zugriff auf APIs der Google Play-Dienste.

Callback-Objekt erstellen

Wenn Sie die Sitzung für den Boost bei schlechten Lichtverhältnissen erstellen, müssen Sie ihr ein Objekt übergeben, das die LowLightBoostCallback-Schnittstelle implementiert. Die Funktionen dieses Objekts werden aufgerufen, wenn die Sitzung getrennt oder zerstört wird. Im folgenden Code wird gezeigt, wie ein Callback erstellt wird:

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

Wichtige Punkte zu diesem Code

  • In diesem Code wird die private Methode createLowLightBoostCallback() definiert, die das Callback-Objekt erstellt. Sie rufen diese Methode auf, wenn Sie die Sitzung mit dem Modus „Sehr schlechte Lichtverhältnisse“ erstellen, wie unter Sitzung erstellen beschrieben.
  • Der Rückruf wird aufgerufen, wenn die Sitzung getrennt oder zerstört wird. Sie wird nicht beim Erstellen der Sitzung aufgerufen. Prüfe, ob die Sitzung erfolgreich erstellt wurde, indem du das Task-Objekt ansiehst, das von LowLightBoostClient.createSession zurückgegeben wurde.

Sitzung erstellen

Rufen Sie die Methode LowLightBoostClient.createSession auf, um eine Sitzung bei schlechten Lichtverhältnissen zu erstellen.

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

Wichtige Punkte zu diesem Code

  • Sie übergeben ein LowLightBoostOptions-Objekt an createSession(), um die Sitzung zu konfigurieren. Dieses Objekt gibt unter anderem die Zielfläche, die ID der zu verwendenden Kamera und die Abmessungen der Vorschau an.
  • In diesem Code wird davon ausgegangen, dass Sie bereits eine Verbindung zu einer Camera2-Kamera geöffnet und anhand dieser Informationen die Werte von cameraId, previewWidth, previewHeight festgelegt haben. Weitere Informationen finden Sie in der Camera2-Dokumentation.
  • enableLowLightBoost ist ein boolescher Wert, der angibt, ob die Funktion „Boost bei schlechten Lichtverhältnissen“ aktiviert oder deaktiviert werden soll.
  • createLowLightBoostCallback ist eine Methode, die du schreibst, um das Callback-Objekt zu erstellen. Dieses Objekt wird aufgerufen, wenn die Sitzung getrennt oder zerstört wird.
  • Die Methode LowLightBoostClient.createSession() gibt ein Task-Objekt zurück. Mit diesem Objekt richten Sie Erfolgs- und Fehler-Listener ein. Erfassen Sie das Video im Erfolgsereignis-Listener.
  • Sie können einen Executor angeben, um die Listener auszuführen. Wenn Sie keinen Executor angeben, werden die Listener im Hauptthread ausgeführt. In diesem Code gehen wir davon aus, dass lowLightBoostExecutor eine geeignete Executor ist.

Kameravorschau starten

Nachdem Sie eine Sitzung bei schlechten Lichtverhältnissen erstellt haben, können Sie den Kameravorschau-Stream starten. Das sollte im onSuccess()-Callback geschehen, den Sie an die Sitzung bei schlechten Lichtverhältnissen übergeben, wie unter Sitzung erstellen beschrieben. Im folgenden Code wird gezeigt, wie Sie ein Video aufnehmen:

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

Wichtige Punkte zu diesem Code

  • lowLightBoostSession ist die Sitzung, die Sie unter Sitzung erstellen erstellt haben.
  • setSceneDetectorCallback() definiert ein Callback-Objekt, das die Schnittstelle SceneDetectorCallback implementiert. Die Sitzung ruft die Methode onSceneBrightnessChanged() dieses Objekts auf, wenn sich die Helligkeit der Szene ändert. Bei Ihrer Implementierung sollte die Benutzeroberfläche der Kamera entsprechend angepasst werden.
  • Sie können einen Executor angeben, um den Callback auszuführen. Wenn Sie keinen Executor angeben, wird der Callback im Hauptthread ausgeführt. In diesem Code gehen wir davon aus, dass lowLightBoostExecutor eine geeignete Executor ist.
  • lowLightBoostSession.getCameraSurface() gibt die Surface mit dem aufgenommenen Video zurück.

Sitzung freigeben

Wenn die Kamera nicht mehr aktiv ist, beenden Sie die Sitzung mit dem Modus für schlechte Lichtverhältnisse, indem Sie LowLightBoostSession.release() drücken. Achten Sie insbesondere darauf, die Sitzung freizugeben, wenn Ihre Aktivität beendet wird. Rufen Sie dazu die Methode in der onDestroy()-Methode Ihrer Aktivität auf:

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

Wichtige Punkte zu diesem Code

  • Nach der Freigabe der Sitzung sollten Sie keine ihrer Methoden mehr aufrufen. Sie sollten alle Variablen löschen, die auf die Sitzung verweisen, wie in diesem Code.