Utilizza una sessione di aumento luce per attivare e disattivare l'aumento luce di Google.
Kotlin
dependencies {
val low_light_boost_version = "16.0.0-beta01"
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.0-beta01"
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 Google Play Services
com.google.android.gms.cameralowlight
. Consulta la documentazione di Google Play Services per informazioni su come accedere 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 implementi 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 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 distrutta. Non viene chiamata 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
- Devi passare un oggetto
LowLightBoostOptions
acreateSession()
per configurare la sessione. Questo oggetto specifica elementi quali 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'aumento della luminosità in condizioni di scarsa illuminazione deve essere attivato o disattivato.createLowLightBoostCallback
è un metodo che scrivi per creare l'oggetto callback. Questo oggetto viene chiamato quando la sessione viene disconnessa o distrutta.- Il metodo
LowLightBoostClient.createSession()
restituisce un oggettoTask
. Utilizza questo oggetto per configurare gli ascoltatori di successo e di errore. Acquisisci il video all'interno dell'ascoltatore di eventi di successo. - Puoi specificare un
Executor
per eseguire gli ascoltatori. Se non specifichi unExecutor
, gli ascoltatori vengono eseguiti nel thread principale. In questo codice, assumiamo chelowLightBoostExecutor
sia unExecutor
adatto.
Avvia l'anteprima della fotocamera
Dopo aver creato una sessione in condizioni di scarsa illuminazione, puoi avviare lo stream di anteprima della fotocamera. Devi eseguire questa operazione 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 un 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. 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 nel thread principale. In questo codice, assumiamo chelowLightBoostExecutor
sia unExecutor
adatto. lowLightBoostSession.getCameraSurface()
restituisceSurface
con il video acquisito.
Rilascia la sessione
Quando la videocamera non è più attiva, rilascia la sessione di aumento della sensibilità in condizioni di scarsa illuminazione chiamando LowLightBoostSession.release()
. In particolare, devi assicurarti di liberare la sessione quando l'attività viene distrutta. Per farlo, chiama il metodo nel metodo onDestroy()
dell'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 relativi metodi. Devi cancellare tutte le variabili che rimandano alla sessione, come fa questo codice.