Utilizza una sessione di miglioramento in condizioni di scarsa illuminazione per attivare e disattivare Google Low Light Boost.
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")
}
Alla moda
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 è fornito dal pacchetto di Google Play Services
com.google.android.gms.cameralowlight. Per informazioni su come accedere alle API di Google
Play services, consulta la documentazione di Google
Play services.
Creare un oggetto di callback
Quando crei la sessione di miglioramento in condizioni di scarsa illuminazione, devi passargli un
oggetto che implementa l'interfaccia LowLightBoostCallback.
Le funzioni di questo oggetto vengono chiamate quando la sessione viene disconnessa o eliminata. Il seguente codice mostra come creare un callback:
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;
}
Punti chiave di questo codice
- Questo codice definisce un metodo privato,
createLowLightBoostCallback(), che crea l'oggetto di callback. Chiamerai questo metodo quando crei effettivamente la sessione di miglioramento in condizioni di scarsa illuminazione, come descritto in Creare una sessione. - Il callback viene chiamato quando la sessione viene disconnessa o eliminata. Non viene chiamato quando viene creata la sessione. Per verificare se la sessione è stata
creata correttamente, esamina l'oggetto
Taskrestituito daLowLightBoostClient.createSession.
Creare una sessione
Per creare una sessione in condizioni di scarsa illuminazione, chiama il metodo
LowLightBoostClient.createSession.
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");
});
Punti chiave di questo codice
- Passa un
LowLightBoostOptionsoggetto acreateSession()per configurare la sessione. Questo oggetto specifica elementi come la superficie di destinazione, l'ID della videocamera da utilizzare e le dimensioni dell'anteprima. - Questo codice presuppone che tu abbia già aperto una connessione a una videocamera Camera2,
e che tu abbia utilizzato queste informazioni per impostare i valori di
cameraId, previewWidth, previewHeight. Per saperne di più, consulta la documentazione di Camera2. enableLowLightBoostè un valore booleano che specifica se il miglioramento in condizioni di scarsa illuminazione deve essere attivato o disattivato.createLowLightBoostCallbackè un metodo che scrivi per creare l'oggetto di callback. Questo oggetto viene chiamato quando la sessione viene disconnessa o eliminata.- Il metodo
LowLightBoostClient.createSession()restituisce unTaskoggetto. Utilizza questo oggetto per configurare i listener di successo e di errore. Acquisisci il video all'interno del listener di successo. - Puoi specificare un
Executorper eseguire i listener. Se non specifichi unExecutor, i listener vengono eseguiti sul thread principale. In questo codice, presupponiamo chelowLightBoostExecutorsia unExecutoradatto.
Passare i risultati dell'acquisizione
Google Low Light Boost ha bisogno di determinati metadati della videocamera per conoscere la quantità corretta di luminosità da applicare. Devi passare TotalCaptureResult al
processCaptureResult() metodo. Puoi ottenere TotalCaptureResult in
il onCaptureCompleted() metodo di callback.
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);
}
}
};
Punti chiave di questo codice
- Questo codice mostra solo il codice
CaptureCallbackpertinente a Google LLB. Probabilmente avrai altro codice in questi callback. - Il passaggio di
TotalCaptureResultconsente a Google LLB di analizzare i dati di esposizione automatica e altri metadati necessari per il miglioramento in condizioni di scarsa illuminazione per elaborare il rilevamento della scena e determinare la quantità di miglioramento da applicare al frame. - Devi passare l'oggetto
captureCallbackquando crei la sessione della videocamera, ad esempio con `setSingleRepeatingRequest().
Avviare l'anteprima della videocamera
Dopo aver creato una sessione in condizioni di scarsa illuminazione, puoi avviare lo stream di anteprima della videocamera. Devi farlo
all'interno del onSuccess() callback che passi alla sessione in condizioni di scarsa illuminazione, come
descritto in Creare una sessione. Il seguente codice mostra come acquisire video:
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.
}
Punti chiave di questo codice
lowLightBoostSessionè la sessione che hai creato in Creare una sessione.setSceneDetectorCallback()definisce un oggetto di callback che implementa l'interfacciaSceneDetectorCallback. La sessione chiama il metodoonSceneBrightnessChanged()dell'oggetto quando la luminosità della scena cambia. La tua implementazione deve regolare l'UI della videocamera in modo appropriato.- Puoi specificare un
Executorper eseguire il callback. Se non specifichi unExecutor, il callback viene eseguito sul thread principale. In questo codice, presupponiamo chelowLightBoostExecutorsia unExecutoradatto. lowLightBoostSession.getCameraSurface()restituisceSurfacecon il video acquisito.
Rilasciare la sessione
Quando la videocamera non è più attiva, rilascia la sessione di miglioramento in condizioni di scarsa illuminazione chiamando LowLightBoostSession.release(). In particolare, devi assicurarti di rilasciare la sessione quando la tua attività viene eliminata. Puoi farlo chiamando il metodo nel metodo onDestroy() della tua attività:
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;
}
}
Punti chiave di questo codice
- Dopo aver rilasciato la sessione, non devi chiamare nessuno dei suoi metodi. Devi cancellare tutte le variabili che puntano alla sessione, come fa questo codice.