Mit einer Sitzung für wenig Licht können Sie den Google-Modus für wenig Licht aktivieren und 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 Paket com.google.android.gms.cameralowlight
der Google Play-Dienste 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 Sitzung für die Verstärkung bei wenig Licht 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. 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
- Mit diesem Code wird eine private Methode,
createLowLightBoostCallback()
, definiert, mit der das Callback-Objekt erstellt wird. Sie rufen diese Methode auf, wenn Sie die Sitzung für die Verstärkung bei wenig Licht erstellen, wie unter Sitzung erstellen beschrieben. - Der Callback wird aufgerufen, wenn die Verbindung zur Sitzung getrennt oder die Sitzung beendet wird. Sie wird nicht aufgerufen, wenn die Sitzung erstellt wird. Um zu prüfen, ob die Sitzung erfolgreich erstellt wurde, untersuchen Sie das von
LowLightBoostClient.createSession
zurückgegebeneTask
-Objekt.
Sitzung erstellen
Rufen Sie zum Erstellen einer Sitzung bei wenig Licht die Methode LowLightBoostClient.createSession
auf.
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 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 „Low Light Boost“ aktiviert oder deaktiviert sein soll.createLowLightBoostCallback
ist 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 einTask
-Objekt zurück. Mit diesem Objekt richten Sie Listener für Erfolg und Fehler ein. Video im Success-Listener aufnehmen - Sie können ein
Executor
angeben, um die Listener auszuführen. Wenn Sie keinenExecutor
angeben, werden die Listener im Hauptthread ausgeführt. In diesem Code gehen wir davon aus, dasslowLightBoostExecutor
ein geeigneterExecutor
ist.
Ergebnisse der Aufnahme übergeben
Für die Funktion „Low Light Boost“ von Google sind bestimmte Kamerametadaten erforderlich, damit die richtige Aufhellung angewendet werden kann. Sie müssen TotalCaptureResult
an die Methode processCaptureResult()
übergeben. Sie können den 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
- Dieser Code enthält nur den
CaptureCallback
-Code, der für Google LLB relevant ist. Wahrscheinlich haben Sie in diesen Rückrufen auch anderen Code. - Durch die Übergabe von
TotalCaptureResult
kann Google LLB die Daten zur automatischen Belichtung und andere Metadaten analysieren, die für die Verarbeitung der Szenenerkennung und die Bestimmung der Verstärkung des Frames erforderlich sind. - Sie sollten das
captureCallback
-Objekt beim Erstellen der Kamerasitzung übergeben, z. B. mit setSingleRepeatingRequest().
Kameravorschau starten
Nachdem Sie eine Sitzung für schlechte Lichtverhältnisse erstellt haben, können Sie den Kameravorschaustream starten. Das sollte im onSuccess()
-Callback erfolgen, den Sie an die Sitzung für schwaches Licht übergeben, wie unter Sitzung erstellen beschrieben. Der folgende Code zeigt, wie Sie Videos 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 dieSceneDetectorCallback
-Schnittstelle implementiert. Die Sitzung ruft die MethodeonSceneBrightnessChanged()
des Objekts auf, wenn sich die Helligkeit der Szene ändert. Die Benutzeroberfläche der Kamera sollte entsprechend angepasst werden.- Sie können ein
Executor
angeben, um den Callback auszuführen. Wenn Sie keinExecutor
angeben, wird der Callback im Hauptthread ausgeführt. In diesem Code gehen wir davon aus, dasslowLightBoostExecutor
ein geeigneterExecutor
ist. lowLightBoostSession.getCameraSurface()
gibt dieSurface
mit dem aufgenommenen Video zurück.
Sitzung freigeben
Wenn die Kamera nicht mehr aktiv ist, beenden Sie die Sitzung mit Low-Light-Boost durch Aufrufen von LowLightBoostSession.release()
. 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
- Nachdem die Sitzung freigegeben wurde, sollten Sie keine ihrer Methoden aufrufen. Sie sollten alle Variablen löschen, die auf die Sitzung verweisen, wie in diesem Code.