Sitzung mit Modus für wenig Licht verwenden

Verwenden Sie eine Low Light-Modus-Sitzung, um den Google Low Light-Modus ein- und auszuschalten.

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

Callback-Objekt erstellen

Wenn Sie die Sitzung für die Optimierung bei wenig Licht erstellen, müssen Sie ein Objekt übergeben, das die Schnittstelle LowLightBoostCallback implementiert. Die Funktionen dieses Objekts werden aufgerufen, wenn die Sitzung getrennt oder beendet wird. Der folgende Code zeigt, 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

  • Dieser Code definiert eine private Methode, createLowLightBoostCallback(), die das Callback-Objekt erstellt. Sie rufen diese Methode auf, wenn Sie die Sitzung für die Optimierung bei schwachem Licht erstellen, wie unter Sitzung erstellen beschrieben.
  • Der Callback wird aufgerufen, wenn die Sitzung getrennt oder beendet wird. Sie wird nicht aufgerufen, wenn die Sitzung erstellt wird. Prüfen Sie, ob die Sitzung erfolgreich erstellt wurde. Sehen Sie sich dazu das von LowLightBoostClient.createSession zurückgegebene Objekt Task an.

Sitzung erstellen

Rufen Sie die Methode LowLightBoostClient.createSession auf, um eine Sitzung für schlechte Lichtverhältnisse 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 beispielsweise die Zieloberflä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 hergestellt und diese Informationen verwendet haben, um die Werte von cameraId, previewWidth, previewHeight festzulegen. Weitere Informationen finden Sie in der Camera2-Dokumentation.
  • enableLowLightBoost ist ein boolescher Wert, der angibt, ob die Funktion „Optimierung bei wenig Licht“ standardmäßig aktiviert oder deaktiviert sein soll.
  • createLowLightBoostCallback ist eine Methode, die Sie schreiben, um das Callback-Objekt zu erstellen. Dieses Objekt wird aufgerufen, wenn die Sitzung getrennt oder beendet wird.
  • Die Methode LowLightBoostClient.createSession() gibt ein Task-Objekt zurück. Mit diesem Objekt richten Sie Erfolgs- und Fehler-Listener ein. Nehmen Sie das Video im Success-Listener auf.
  • 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 wird davon ausgegangen, dass lowLightBoostExecutor ein geeigneter Executor ist.

Ergebnisse der Erfassung übergeben

Der Low Light-Modus von Google benötigt bestimmte Kamerametadaten, um die richtige Aufhellung zu bestimmen. Sie müssen die TotalCaptureResult an die Methode processCaptureResult() übergeben. Sie können die TotalCaptureResult in der Callback-Methode onCaptureCompleted() abrufen.

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

Wichtige Punkte zu diesem Code

  • In diesem Code wird nur der CaptureCallback-Code angezeigt, der für Google LLB relevant ist. In diesen Callbacks ist wahrscheinlich weiterer Code enthalten.
  • Durch die Übergabe von TotalCaptureResult kann Google LLB die Daten zur automatischen Belichtung und andere Metadaten analysieren, die für die Szenenerkennung und die Bestimmung des erforderlichen Boosts für den Frame erforderlich sind.
  • Sie sollten das captureCallback-Objekt beim Erstellen der Kamerasitzung übergeben, z. B. mit setSingleRepeatingRequest().

Kameravorschau starten

Nachdem du eine Sitzung für schlechte Lichtverhältnisse erstellt hast, kannst du den Kameravorschaustream starten. Dies sollte im onSuccess()-Callback erfolgen, den Sie an die Sitzung für schlechte Lichtverhältnisse übergeben, wie unter Sitzung erstellen beschrieben. Der folgende Code zeigt, 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 SceneDetectorCallback-Schnittstelle implementiert. Die Sitzung ruft die Methode onSceneBrightnessChanged() dieses Objekts auf, wenn sich die Helligkeit der Szene ändert. In deiner Implementierung sollte die Kamera-UI 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 wird davon ausgegangen, dass lowLightBoostExecutor ein geeigneter Executor ist.
  • lowLightBoostSession.getCameraSurface() gibt die Surface mit dem aufgenommenen Video zurück.

Sitzung freigeben

Wenn die Kamera nicht mehr aktiv ist, gib die Sitzung für die Optimierung bei schlechten Lichtverhältnissen frei, indem du LowLightBoostSession.release() aufrufst. Achte insbesondere darauf, die Sitzung freizugeben, wenn deine 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

  • Nachdem die Sitzung freigegeben wurde, sollten Sie keine ihrer Methoden mehr aufrufen. Sie sollten alle Variablen löschen, die auf die Sitzung verweisen, wie es in diesem Code der Fall ist.