Verwenden Sie eine Low Light-Modus-Sitzung, um den Google Low Light-Modus zu aktivieren und zu deaktivieren.
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
com.google.android.gms.cameralowlight-Paket bereitgestellt. Informationen zum Zugriff auf Google Play-Dienste
APIs finden Sie in der Dokumentation zu den Google
Play-Diensten.
Callback-Objekt erstellen
Wenn Sie die Low Light-Modus-Sitzung erstellen, müssen Sie ihr ein
Objekt übergeben, das die LowLightBoostCallback-Schnittstelle implementiert.
Die Funktionen dieses Objekts werden aufgerufen, wenn die Verbindung zur Sitzung getrennt oder die Sitzung beendet wird. Im folgenden Code wird gezeigt, wie Sie einen Callback erstellen:
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, mit der das Callback-Objekt erstellt wird. Sie rufen diese Methode auf, wenn Sie die Low Light-Modus-Sitzung tatsächlich erstellen, wie unter Sitzung erstellen beschrieben. - Der Callback wird aufgerufen, wenn die Verbindung zur Sitzung getrennt oder die Sitzung beendet wird. Er wird nicht aufgerufen, wenn die Sitzung erstellt wird. Prüfen Sie das
Task-Objekt, das vonLowLightBoostClient.createSessionzurückgegeben wird, um festzustellen, ob die Sitzung erfolgreich erstellt wurde.
Sitzung erstellen
Rufen Sie die Methode
LowLightBoostClient.createSession auf, um eine Low Light-Modus-Sitzung 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 ancreateSession(), um die Sitzung zu konfigurieren. Dieses Objekt gibt unter anderem 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 geöffnet haben,
und diese Informationen verwendet haben, um die Werte von
cameraId, previewWidth, previewHeightfestzulegen. Weitere Informationen finden Sie in der Camera2-Dokumentation. enableLowLightBoostist ein boolescher Wert, der angibt, ob der Low Light-Modus aktiviert oder deaktiviert werden soll.createLowLightBoostCallbackist eine Methode, die Sie schreiben, um das Callback-Objekt zu erstellen. Dieses Objekt wird aufgerufen, wenn die Verbindung zur Sitzung getrennt oder die Sitzung beendet wird.- Die Methode
LowLightBoostClient.createSession()gibt einTaskObjekt zurück. Mit diesem Objekt richten Sie Listener für Erfolg und Fehler ein. Erfassen Sie das Video im Erfolgs-Listener. - Sie können einen
Executorangeben, um die Listener auszuführen. Wenn Sie keinenExecutorangeben, werden die Listener im Hauptthread ausgeführt. In diesem Code wird davon ausgegangen, dasslowLightBoostExecutorein geeigneterExecutorist.
Aufnahmeergebnisse übergeben
Der Google Low Light-Modus benötigt bestimmte Kamerametadaten, um zu wissen, wie viel Aufhellung angewendet werden muss. Sie müssen TotalCaptureResult an die
processCaptureResult() Methode übergeben. TotalCaptureResult erhalten Sie in
der onCaptureCompleted() Callback-Methode.
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 gezeigt, der für den Google Low Light-Modus relevant ist. Wahrscheinlich haben Sie in diesen Callbacks noch anderen Code. - Durch die Übergabe von
TotalCaptureResultkann der Google Low Light-Modus die Daten zur automatischen Belichtung und andere Metadaten analysieren, die für die Szenenerkennung und die Bestimmung der Aufhellung des Frames erforderlich sind. - Sie sollten das Objekt
captureCallbackübergeben, wenn Sie die Kamera sitzung erstellen, z. B. mit `setSingleRepeatingRequest().
Kameravorschau starten
Nachdem Sie eine Low Light-Modus-Sitzung erstellt haben, können Sie den Kameravorschau-Stream starten. Sie sollten dies im onSuccess() Callback tun, das Sie an die Low Light-Modus-Sitzung ü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
lowLightBoostSessionist die Sitzung, die Sie unter Sitzung erstellen erstellt haben.setSceneDetectorCallback()definiert ein Callback-Objekt, das dieSceneDetectorCallback-Schnittstelle implementiert. Die Sitzung ruft die MethodeonSceneBrightnessChanged()dieses Objekts auf, wenn sich die Helligkeit der Szene ändert. Ihre Implementierung sollte die UI der Kamera entsprechend anpassen.- Sie können einen
Executorangeben, um den Callback auszuführen. Wenn Sie keinenExecutorangeben, wird der Callback im Hauptthread ausgeführt. In diesem Code wird davon ausgegangen, dasslowLightBoostExecutorein geeigneterExecutorist. lowLightBoostSession.getCameraSurface()gibt dieSurfacemit dem aufgenommenen Video zurück.
Sitzung freigeben
Wenn die Kamera nicht mehr aktiv ist, geben Sie die Low Light-Modus-Sitzung frei, indem Sie LowLightBoostSession.release() aufrufen. Insbesondere sollten Sie die Sitzung freigeben, 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
- Nachdem die Sitzung freigegeben wurde, sollten Sie keine ihrer Methoden mehr aufrufen. Sie sollten alle Variablen löschen, die auf die Sitzung verweisen, wie in diesem Code.