Crea y usa un cliente de mejora de poca luz

Para usar la función Mejora con poca luz de Google, necesitarás un cliente de mejora con poca luz. Puedes usar el cliente para verificar si el módulo de mejora de poca luz está instalado y si el dispositivo y la cámara en los que se ejecuta la app admiten la función de mejora de poca luz de Google. También usarás el cliente para crear un LowLightBoostSession. (Usarás la sesión para activar y desactivar el aumento de la luz baja). También puedes configurar un objeto de escucha para recibir devoluciones de llamada cuando el aumento de la luz baja esté activo.

Los métodos LowLightBoostClient no indican el éxito o el fracaso directamente. En su lugar, muestran un objeto Task. Usas un Task para configurar objetos de escucha de éxito y falla. Esto permite que los métodos indiquen el éxito o el fracaso de forma asíncrona, lo que es necesario, ya que los métodos deben comunicarse con los Servicios de Google Play.

Dependencias

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'
}

LowLightBoostClient 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 cliente

Necesitas un cliente de aumento de luz baja para hacer cualquier otra acción. El siguiente código crea un cliente:

Kotlin

val lowLightBoostClient = LowLightBoost.getClient(context)

Java

LowLightBoostClient lowLightBoostClient = LowLightBoost.getClient(context);

Puntos clave sobre este código

  • La clase LowLightBoost proporciona el método estático getClient, que muestra una instancia de LowLightBoostClient.

Comprueba si el módulo de mejora de poca luz está instalado

Una vez que tengas un cliente, puedes confirmar si el módulo de aumento de luz baja está instalado en tu dispositivo. El siguiente código verifica si el módulo está instalado:

Kotlin

// Handle the Google Play services Task API with Kotlin coroutines
// (kotlinx-coroutines-play-services)
launch {
  try {
    val isInstalled: Boolean = lowLightBoostClient
      .isModuleInstalled(context).await()

    if (isInstalled) {
      Log.d(TAG, "Module is installed")
      try {
        openCamera(cameraId)
      } catch (e: CameraAccessException) {
        Log.e(TAG, "Failed to open camera", e)
      }
    } else {
      Log.d(TAG, "Module is not installed")
      launchInstallRequest()
    }
  } catch (e: Exception) {
    Log.e(TAG, "Failed to check module availability", e)
  }
}

Java

lowLightBoostClient
  .isModuleInstalled(context)
  .addOnSuccessListener(
    (isInstalled) -> {
      if (isInstalled) {
        Log.d(TAG, "Module is installed");
        try {
          openCamera(cameraId);
        } catch (CameraAccessException e) {
          Log.e(TAG, "Failed to open camera", e);
        }
      } else {
        Log.d(TAG, "Module is not installed");
        launchInstallRequest();
      }
    })
  .addOnFailureListener(
    (e) -> {
      Log.e(TAG, "Failed to check module availability", e);
    });

Puntos clave sobre este código

  • Este código abre una sesión de la cámara que se conecta a la cámara identificada por cameraId. Para obtener más información, consulta la documentación de Camera2.
  • El método LowLightBoostClient.isModuleInstalled() muestra un objeto Task. Usas este objeto para configurar objetos de escucha de éxito y error.
  • Usa Task.addOnSuccessListener() para configurar un objeto de escucha al que se le llame si la llamada a isModuleInstalled() se realiza correctamente. Es importante que, si se llama al objeto de escucha de éxito, esto solo te indique que el cliente pudo averiguar si el módulo está instalado en el dispositivo. En el cuerpo de tu objeto de escucha, debes verificar si el módulo está instalado o no.
  • Si el módulo aún no está instalado, este fragmento lo instala llamando al método launchInstallRequest(). Ese método se define en el fragmento de Cómo instalar el módulo de mejora de baja luminosidad.

Instala el módulo de mejora con poca luz

Si el módulo de mejora de poca luz aún no está instalado en el dispositivo, deberás descargarlo e instalarlo desde los Servicios de Google Play. En este código, se muestra cómo hacerlo:

Kotlin

private suspend fun launchInstallRequest() {
  Log.v(TAG, "Launching install request")

  try {
    // Check if this device can support Google LLB.
    val isDeviceSupported: Boolean = lowLightBoostClient
      .isDeviceSupported(context).await()

    if (isDeviceSupported) {
      Log.d(TAG, "Device is supported")
      // Show download indicator, if needed.

      try {
        val isInstallSuccessful: Boolean = lowLightBoostClient
          .installModule(context,
                        createInstallStatusCallback()
          ).await()

        if (isInstallSuccessful) {
          Log.d(TAG, "Module installed")
          // Hide download indicator, if needed.
          try {
            openCamera()
          } catch (e: CameraAccessException) {
            Log.e(TAG, "Failed to open camera", e)
          }
        } else {
          Log.d(TAG, "Module install failed")
        }
      } catch (e: Exception) {
        Log.e(TAG, "An error occurred installing the module:", e)
      }
    } else {
      Log.d(TAG, "Device is not supported")
    }
  } catch (e: Exception) {
    Log.e(TAG, "An error occurred checking device support:", e)
  }
}

Java

private void launchInstallRequest() {
  Log.v(TAG, "Launching install request");
  // Check if this device can support Google LLB.
  lowLightBoostClient
    .isDeviceSupported(context)
    .addOnSuccessListener(
      (isDeviceSupported) -> {
        if (isDeviceSupported) {
          Log.d(TAG, "Device is supported");
          // Show download indicator, if needed.
          lowLightBoostClient
            .installModule(
              this,
              createInstallStatusCallback()
            )
            .addOnSuccessListener(
              (result) -> {
                if (result) {
                  Log.d(TAG, "Module installed");
                  // Hide download indicator, if needed.
                  try {
                    openCamera();
                  } catch (CameraAccessException e) {
                    Log.e(TAG, "Failed to open camera", e);
                  }
                } else {
                  Log.d(TAG, "Module install failed");
                }
              }
            );
        } else {
          Log.d(TAG, "Device is not supported");
        }
      })
    .addOnFailureListener(
      (e) -> {
        Log.e(TAG, "Failed to check device support", e);
      });
}

Puntos clave sobre este código

  • Cuando llamas a LowLightBoostClient.installModule(), pasas un objeto de devolución de llamada, que implementa LowLightBoostClient.InstallStatusCallback. installModule() llama a métodos en esa devolución de llamada para indicar el estado de la descarga. Por ejemplo, si se pausa la descarga, installModule() llama al método onDownloadPause() del objeto de devolución de llamada.
  • En este fragmento de código, el método createInstallStatusCallback() crea el objeto de devolución de llamada. Debes escribir ese método por tu cuenta, de la siguiente manera:

Kotlin

private fun createInstallStatusCallback(): LowLightBoostClient.InstallStatusCallback =
        object : LowLightBoostClient.InstallStatusCallback() {
    override fun onDownloadPending() {
      Log.d(TAG, "onDownloadPending")
      // Code here...
    }

    override fun onDownloadStart() {
      Log.d(TAG, "onDownloadStart")
      // Code here...
    }

    // other overrides here...
  }

Java

private InstallStatusCallback createInstallStatusCallback() {
  new LowLightBoostClient.InstallStatusCallback() {
    @Override
    public void onDownloadPending() {
      Log.d(TAG, "onDownloadPending");
      // Code here...
    }

    @Override
    public void onDownloadStart() {
      Log.d(TAG, "onDownloadStart");
      // Code here...
    }

  // other overrides here...
}
  • LowLightBoostClient.isDeviceSupported() verifica si el dispositivo con Android y el sistema operativo son compatibles con el aumento de brillo con poca luz de Google. De lo contrario, no descargues el módulo.

  • El método LowLightBoostClient.installModule() muestra un objeto Task. Usas este objeto para configurar objetos de escucha de éxito y error.

  • Cuando finaliza la instalación, el objeto de escucha de éxito abre la cámara para verificarla. En el fragmento, esto se hace con una llamada a openCamera(). Deberás escribir ese método por tu cuenta.

Comprueba si se admite la mejora con poca luz

Una vez que tengas un cliente, puedes verificar si el dispositivo en el que se ejecuta la app admite la mejora de poca luz. El siguiente código verifica si se admite la mejora de poca luz:

Kotlin

launch {
  try {
    // Await the result of the Task in a non-blocking way
    val isSupported: Boolean = lowLightBoostClient
      .isCameraSupported(cameraId).await()
    Log.d(TAG, "isCameraSupported: $isSupported")
    if (isSupported) {
      // Create the low light boost session here
    }
  } catch (e: Exception) {
    Log.e(TAG, "isCameraSupported failed", e)
  }
}

Java

lowLightBoostClient
  .isCameraSupported(cameraId)
  .addOnSuccessListener(
    lowLightBoostExecutor,
    (isSupported) -> {
      Log.d(TAG, "isCameraSupported: " + isSupported);
      if (isSupported) {
        // Create the low light boost session here
      }
    )

Puntos clave sobre este código

  • Se supone que cameraId es el ID de una cámara Camera2, creada en otro lugar.
  • LowLightBoostClient.isCameraSupported() verifica si la cámara de Camera2 admite el aumento de poca luz. En algunos casos, es posible que un dispositivo admita la mejora de poca luz, pero que una de sus cámaras no lo haga, por lo que debes verificar ambas.
  • El método LowLightBoostClient.isCameraSupported() muestra un objeto Task. Usas este objeto para configurar objetos de escucha de éxito y error. Crea la sesión de mejora con poca luz dentro del objeto de escucha de éxito.