Utilizza una sessione di miglioramento in condizioni di scarsa illuminazione per attivare e disattivare la funzionalità di Google.
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
è fornito dal pacchetto
com.google.android.gms.cameralowlight
di Google Play Services. Consulta la documentazione di Google
Play Services per informazioni sull'accesso alle API di Google Play Services.
Creare un oggetto di callback
Quando crei la sessione di potenziamento in condizioni di scarsa illuminazione, devi passare un oggetto che implementa l'interfaccia LowLightBoostCallback
.
Le funzioni di questo oggetto vengono chiamate quando la sessione viene disconnessa o
distrutta. 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 callback. Chiamerai questo metodo quando crei effettivamente la sessione di potenziamento 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
Task
restituito 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 oggetto
LowLightBoostOptions
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 ulteriori informazioni, consulta la documentazione di Camera2. enableLowLightBoost
è un valore booleano che specifica se l'ottimizzazione in condizioni di scarsa illuminazione deve essere attivata o disattivata.createLowLightBoostCallback
è un metodo che scrivi per creare l'oggetto callback. Questo oggetto viene chiamato quando la sessione viene disconnessa o eliminata.- Il metodo
LowLightBoostClient.createSession()
restituisce un oggettoTask
. Utilizzi questo oggetto per configurare i listener di esito positivo e negativo. Acquisisci il video all'interno del listener di successo. - Puoi specificare un
Executor
per eseguire i listener. Se non specifichi unExecutor
, i listener vengono eseguiti sul thread principale. In questo codice, supponiamo chelowLightBoostExecutor
sia unExecutor
adatto.
Superato nei risultati dell'acquisizione
Google Low Light Boost ha bisogno di determinati metadati della fotocamera per conoscere la quantità corretta
di luminosità da applicare. Devi passare TotalCaptureResult
al metodo
processCaptureResult()
. Puoi ottenere TotalCaptureResult
nel metodo di callback onCaptureCompleted()
.
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
CaptureCallback
pertinente a Google LLB. Probabilmente avrai altro codice in questi callback. - L'inserimento di
TotalCaptureResult
consente a Google LLB di analizzare i dati di esposizione automatica e altri metadati necessari per il potenziamento in condizioni di scarsa illuminazione per elaborare il rilevamento della scena e determinare la quantità di potenziamento da applicare al frame. - Devi passare l'oggetto
captureCallback
quando crei la sessione della videocamera, ad esempio con `setSingleRepeatingRequest().
Avviare l'anteprima della videocamera
Una volta creata una sessione in condizioni di scarsa illuminazione, puoi avviare lo stream dell'anteprima della videocamera. Devi farlo
all'interno del callback onSuccess()
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 Crea una sessione.setSceneDetectorCallback()
definisce un oggetto di callback che implementa l'interfacciaSceneDetectorCallback
. La sessione chiama il metodoonSceneBrightnessChanged()
dell'oggetto quando cambia la luminosità della scena. L'implementazione deve regolare l'interfaccia utente della videocamera in modo appropriato.- Puoi specificare un
Executor
per eseguire il callback. Se non specifichi unExecutor
, il callback viene eseguito sul thread principale. In questo codice, supponiamo chelowLightBoostExecutor
sia unExecutor
adatto. lowLightBoostSession.getCameraSurface()
restituisceSurface
con il video acquisito.
Rilasciare la sessione
Quando la videocamera non è più attiva, termina la sessione di ottimizzazione in condizioni di scarsa illuminazione
chiamando il numero 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 il rilascio della sessione, non devi chiamare nessuno dei suoi metodi. Devi cancellare tutte le variabili che puntano alla sessione, come fa questo codice.