Cómo usar una sesión de mejora con poca luz

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 muestra LowLightBoostClient.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 a createSession() 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 objeto Task. 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 un Executor, los objetos de escucha se ejecutarán en el subproceso principal. En este código, assumimos que lowLightBoostExecutor es un Executor 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

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.