Usa una sesión de mejora con poca luz para activar y desactivar la función Mejora con poca luz de 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
es proporcionado por 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 de poca luz, deberás pasarle un objeto que implemente la interfaz LowLightBoostCallback
.
Se llama a las funciones de este objeto cuando se desconecta o 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 Cómo crear una sesión. - Se llama a la devolución de llamada cuando se desconecta o destruye la sesión. No se lo llama cuando se crea la sesión. Para verificar si la sesión se creó
de forma correcta, examina el objeto
Task
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 objeto
LowLightBoostOptions
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 de 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. enableLowLightBoost
es un valor booleano que especifica si se debe activar o desactivar el aumento de la luz baja.createLowLightBoostCallback
es un método que escribes para crear el objeto de devolución de llamada. Se llama a este objeto cuando se desconecta o destruye la sesión.- El método
LowLightBoostClient.createSession()
muestra un objetoTask
. Usas este objeto para configurar objetos de escucha de éxito y error. Captura el video dentro del objeto de escucha de éxito. - Puedes especificar un
Executor
para ejecutar los objetos de escucha. Si no especificas unExecutor
, los objetos de escucha se ejecutarán en el subproceso principal. En este código, assumimos quelowLightBoostExecutor
es unExecutor
adecuado.
Cómo iniciar 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 hacerlo dentro de la devolución de llamada de onSuccess()
que pasas a la sesión con poca luz, como se describe en Cómo crear 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
lowLightBoostSession
es 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
Executor
para ejecutar la devolución de llamada. Si no especificas unExecutor
, la devolución de llamada se ejecutará en el subproceso principal. En este código, assumimos quelowLightBoostExecutor
es unExecutor
adecuado. lowLightBoostSession.getCameraSurface()
muestra elSurface
con el video capturado.
Libera la sesión
Cuando la cámara ya no esté activa, llama a LowLightBoostSession.release()
para liberar la sesión de aumento de poca luz. 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 que se libera 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.