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.createSessionzurückgegebene ObjektTaskan.
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 ancreateSession(), 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, previewHeightfestzulegen. Weitere Informationen finden Sie in der Camera2-Dokumentation. enableLowLightBoostist ein boolescher Wert, der angibt, ob die Funktion „Optimierung bei wenig Licht“ standardmäßig aktiviert oder deaktiviert sein soll.createLowLightBoostCallbackist 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 einTask-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
Executorangeben, um die Listener auszuführen. Wenn Sie keinenExecutorangeben, werden die Listener im Hauptthread ausgeführt. In diesem Code wird davon ausgegangen, dasslowLightBoostExecutorein geeigneterExecutorist.
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
TotalCaptureResultkann 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
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. In deiner Implementierung sollte die Kamera-UI entsprechend angepasst werden.- 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, 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.