Usa una sesión de mejora con poca luz para activar y desactivar la función de mejora con poca luz de 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 se proporciona con el paquete
com.google.android.gms.cameralowlight de los Servicios de Google Play. Consulta la documentación de los Servicios de Google
Play para obtener información sobre cómo acceder a las APIs de los Servicios de Google Play.
Crea un objeto de devolución de llamada
Cuando crees la sesión de mejora con poca luz, deberás pasarle un
objeto que implemente la interfaz LowLightBoostCallback.
Se llama a las funciones de este objeto cuando se desconecta o se destruye la sesión. En el siguiente código, se muestra cómo crear una devolución de llamada:
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;
}
Puntos clave sobre este código
- Este código define un método privado,
createLowLightBoostCallback(), que crea el objeto de devolución de llamada. Llamarás a ese método cuando crees la sesión de mejora con poca luz, como se describe en Crea una sesión. - Se llama a la devolución de llamada cuando se desconecta o se destruye la sesión. No se llama cuando se crea la sesión. Para verificar si la sesión se
creó correctamente, examina el
Taskobjeto que muestraLowLightBoostClient.createSession.
Crea una sesión
Para crear una sesión con poca luz, llama al método
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");
});
Puntos clave sobre este código
- Pasas un
LowLightBoostOptionsobjeto acreateSession()para configurar la sesión. Este objeto especifica elementos como la superficie de destino, el ID de la cámara que se usará y las dimensiones de la vista previa. - En este código, se supone que ya abriste una conexión a una cámara Camera2,
y usaste esa información para establecer los valores de
cameraId, previewWidth, previewHeight. Para obtener más información, consulta la documentación de Camera2. enableLowLightBoostes un valor booleano que especifica si la mejora con poca luz debe comenzar activada o desactivada.createLowLightBoostCallbackes un método que escribes para crear el objeto de devolución de llamada. Se llama a este objeto cuando se desconecta o se destruye la sesión.- El método
LowLightBoostClient.createSession()muestra unTaskobjeto. Usas este objeto para configurar objetos de escucha de éxito y falla. Captura el video dentro del objeto de escucha de éxito. - Puedes especificar un
Executorpara ejecutar los objetos de escucha. Si no especificas unExecutor, los objetos de escucha se ejecutan en el subproceso principal. En este código, suponemos quelowLightBoostExecutores unExecutoradecuado.
Pasa los resultados de la captura
La función de mejora con poca luz de Google necesita ciertos metadatos de la cámara para conocer la cantidad correcta de brillo que se debe aplicar. Debes pasar el TotalCaptureResult al
processCaptureResult() método. Puedes obtener el TotalCaptureResult en
el onCaptureCompleted() método de devolución de llamada.
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);
}
}
};
Puntos clave sobre este código
- Este código solo muestra el código
CaptureCallbackrelevante para LLB de Google. Es probable que tengas otro código en estas devoluciones de llamada. - Pasar el
TotalCaptureResultpermite que LLB de Google analice los datos de exposición automática y otros metadatos que son necesarios para que la mejora con poca luz procese la detección de escenas y determine la cantidad de mejora que se debe aplicar al fotograma. - Debes pasar el objeto
captureCallbackcuando crees la sesión de la cámara , por ejemplo, con `setSingleRepeatingRequest().
Inicia la vista previa de la cámara
Una vez que hayas creado una sesión con poca luz, puedes iniciar la transmisión de vista previa de la cámara. Debes hacer
esto dentro de la devolución de llamada onSuccess() que pasas a la sesión con poca luz, como
se describe en Crea una sesión. En el siguiente código, se muestra cómo capturar 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.
}
Puntos clave sobre este código
lowLightBoostSessiones la sesión que creaste en Crea una sesión.setSceneDetectorCallback()define un objeto de devolución de llamada que implementa la interfazSceneDetectorCallback. La sesión llama al métodoonSceneBrightnessChanged()de ese objeto cuando cambia el brillo de la escena. Tu implementación debe ajustar la IU de la cámara de forma adecuada.- Puedes especificar un
Executorpara ejecutar la devolución de llamada. Si no especificas unExecutor, la devolución de llamada se ejecuta en el subproceso principal. En este código, suponemos quelowLightBoostExecutores unExecutoradecuado. lowLightBoostSession.getCameraSurface()muestra elSurfacecon el video capturado.
Libera la sesión
Cuando la cámara ya no esté activa, libera la sesión de mejora con poca luz llamando a LowLightBoostSession.release(). En particular, debes asegurarte de liberar la sesión cuando se destruya tu actividad. Para ello, llama al método en el método onDestroy() de tu actividad:
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;
}
}
Puntos clave sobre este código
- Después de liberar la sesión, no debes llamar a ninguno de sus métodos. Debes borrar todas las variables que apunten a la sesión, como lo hace este código.