Criar e usar um cliente de aumento de baixa luminosidade

Para usar o Google Low Light Boost, você precisa de um cliente do Low Light Boost. É possível usar o cliente para verificar se o módulo do Low Light Boost está instalado e se o Google Low Light Boost é compatível com o dispositivo e a câmera em que o app está sendo executado. Você também vai usar o cliente para criar um LowLightBoostSession. (Essa sessão é usada para ativar e desativar o Low Light Boost.) Também é possível configurar um listener para receber callbacks quando o Low Light Boost estiver ativo.

Os métodos LowLightBoostClient não indicam sucesso ou falha diretamente. Em vez disso, eles retornam um objeto Task. Você usa uma Task para configurar listeners de sucesso e falha. Isso permite que os métodos indiquem sucesso ou falha de forma assíncrona, o que é necessário porque os métodos precisam se comunicar com o Google Play Services.

Dependências

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

LowLightBoostClient é fornecido pelo pacote com.google.android.gms.cameralowlight do Google Play Services. Consulte a documentação do Google Play Services para saber como acessar as APIs do Google Play Services.

Criar um cliente

Você precisa de um cliente do Low Light Boost para fazer qualquer outra coisa. O código a seguir cria um cliente:

Kotlin

val lowLightBoostClient = LowLightBoost.getClient(context)

Java

LowLightBoostClient lowLightBoostClient = LowLightBoost.getClient(context);

Pontos principais sobre esse código

  • A classe LowLightBoost fornece o método estático getClient, que retorna uma instância de LowLightBoostClient.

Verificar se o Low Light Boost é compatível

Depois de ter um cliente, você pode verificar se o Low Light Boost é compatível com o dispositivo em que o app está sendo executado. O código a seguir verifica se o Low Light Boost é compatível:

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

Pontos principais sobre esse código

  • Supõe-se que cameraId seja o ID de uma Camera2 câmera, criada em outro lugar.
  • LowLightBoostClient.isCameraSupported() verifica se a câmera Camera2 é compatível com o Low Light Boost. Em alguns casos, um dispositivo pode ser compatível com o Low Light Boost, mas uma das câmeras não. Portanto, é necessário verificar os dois.
  • O método LowLightBoostClient.isCameraSupported() retorna um Task objeto. Use esse objeto para configurar listeners de sucesso e falha. Crie a sessão do Low Light Boost dentro do listener de sucesso.

Verificar se o módulo do Low Light Boost está instalado

Depois de ter um cliente, você pode confirmar se o módulo do Low Light Boost está instalado no dispositivo. O código a seguir verifica se o 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);
    });

Pontos principais sobre esse código

  • Esse código abre uma sessão de câmera conectada à câmera identificada por cameraId. Para mais informações, consulte a documentação do Camera2.
  • O método LowLightBoostClient.isModuleInstalled() retorna um Task objeto. Use esse objeto para configurar listeners de sucesso e falha.
  • Use Task.addOnSuccessListener() para configurar um listener que é chamado se a chamada para isModuleInstalled() for bem-sucedida. É importante observar que, se o listener de sucesso for chamado, isso apenas informará que o cliente conseguiu descobrir se o módulo está instalado no dispositivo. No corpo do listener, é necessário verificar se o módulo está instalado ou não.
  • Se o módulo ainda não estiver instalado, esse snippet o instalará chamando o método launchInstallRequest(). Esse método é definido no snippet em Instalar o módulo do Low Light Boost.

Instalar o módulo do Low Light Boost

Se o módulo do Low Light Boost ainda não estiver instalado no dispositivo, será necessário fazer o download e instalá-lo no Google Play Services. Este código mostra como fazer isso:

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);
      });
}

Pontos principais sobre esse código

  • Ao chamar LowLightBoostClient.installModule(), você transmite um objeto de callback que implementa LowLightBoostClient.InstallStatusCallback. installModule() chama métodos nesse callback para indicar o status do download. Por exemplo, se o download estiver pausado, installModule() chamará o método onDownloadPause() do objeto de callback.
  • Nesse snippet de código, o objeto de callback é criado pelo método createInstallStatusCallback(). Você precisará escrever esse método, seguindo estas linhas:

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 se o dispositivo Android e o sistema operacional são compatíveis com o Google Low Light Boost. Se não for, não faça o download do módulo.

  • O método LowLightBoostClient.installModule() retorna um Task objeto. Use esse objeto para configurar listeners de sucesso e falha.

  • Quando a instalação terminar, o listener de sucesso vai verificar a instalação abrindo a câmera. No snippet, isso é feito com uma chamada para openCamera(). Você precisará escrever esse método.