Creare e utilizzare un client di miglioramento in condizioni di scarsa illuminazione

Per utilizzare Google Low Light Boost, devi disporre di un client Low Light Boost. Puoi utilizzare il client per verificare se il modulo di potenziamento in condizioni di scarsa illuminazione è installato e per controllare se Google Low Light Boost è supportato dal dispositivo e dalla fotocamera su cui è in esecuzione la tua app. Utilizzerai il client anche per creare un LowLightBoostSession. (Utilizzerai la sessione per attivare e disattivare la funzionalità Migliora in condizioni di scarsa illuminazione.) Puoi anche configurare un listener per ricevere callback quando è attiva la funzionalità di miglioramento in condizioni di scarsa illuminazione.

LowLightBoostClient non segnalano direttamente la riuscita o il mancato completamento. ma restituiscono un oggetto Task. Utilizzi un Task per configurare i listener di esito positivo e negativo. In questo modo, i metodi possono segnalare la riuscita o il mancato completamento in modo asincrono, il che è necessario poiché devono comunicare con Google Play Services.

Dipendenze

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 è fornito dal pacchetto com.google.android.gms.cameralowlight di Google Play Services. Consulta la documentazione di Google Play Services per informazioni sull'accesso alle API di Google Play Services.

Creare un client

Per fare altro, devi disporre di un client di potenziamento in condizioni di scarsa illuminazione. Il seguente codice crea un client:

Kotlin

val lowLightBoostClient = LowLightBoost.getClient(context)

Java

LowLightBoostClient lowLightBoostClient = LowLightBoost.getClient(context);

Punti chiave di questo codice

  • La classe LowLightBoost fornisce il metodo statico getClient, che restituisce un'istanza di LowLightBoostClient.

Controllare se il potenziamento automatico in condizioni di scarsa illuminazione è supportato

Una volta che hai un cliente, puoi verificare se la funzionalità di miglioramento in condizioni di scarsa illuminazione è supportata dal dispositivo su cui è in esecuzione l'app. Il seguente codice verifica se l'aumento della luce è supportato:

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

Punti chiave di questo codice

  • cameraId si presume sia l'ID di una videocamera Camera2, creato altrove.
  • LowLightBoostClient.isCameraSupported() controlla se la fotocamera Camera2 supporta il miglioramento in condizioni di scarsa illuminazione. In alcuni casi, un dispositivo potrebbe supportare il miglioramento in condizioni di scarsa illuminazione, ma una delle sue videocamere potrebbe non farlo, quindi devi controllare entrambi.
  • Il metodo LowLightBoostClient.isCameraSupported() restituisce un oggetto Task. Utilizzi questo oggetto per configurare i listener di esito positivo e negativo. Crea la sessione di aumento luce all'interno del listener di successo.

Controllare se il modulo di potenziamento in condizioni di scarsa illuminazione è installato

Una volta che hai un cliente, puoi verificare se il modulo di potenziamento in condizioni di scarsa illuminazione è installato sul tuo dispositivo. Il seguente codice controlla se il modulo è installato:

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

Punti chiave di questo codice

  • Questo codice apre una sessione della videocamera che si connette alla videocamera identificata da cameraId. Per ulteriori informazioni, consulta la documentazione di Camera2.
  • Il metodo LowLightBoostClient.isModuleInstalled() restituisce un oggetto Task. Utilizzi questo oggetto per configurare i listener di esito positivo e negativo.
  • Utilizza Task.addOnSuccessListener() per configurare un listener chiamato se la chiamata a isModuleInstalled() ha esito positivo. È importante sottolineare che, se viene chiamato il listener di successo, questo indica solo che il client è riuscito a scoprire se il modulo è installato sul dispositivo. Nel corpo del listener, devi verificare se il modulo è effettivamente installato o meno.
  • Se il modulo non è già installato, questo snippet lo installa chiamando il metodo launchInstallRequest(). Questo metodo è definito nello snippet in Installare il modulo di potenziamento della luce scarsa.

Installare il modulo Aumento luce

Se il modulo di miglioramento in condizioni di scarsa illuminazione non è ancora installato sul dispositivo, devi scaricarlo e installarlo da Google Play Services. Questo codice mostra come eseguire questa operazione:

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

Punti chiave di questo codice

  • Quando chiami LowLightBoostClient.installModule() passi un oggetto di callback, che implementa LowLightBoostClient.InstallStatusCallback. installModule() chiama i metodi in questo callback per indicare lo stato del download. Ad esempio, se il download viene messo in pausa, installModule() chiama il metodo onDownloadPause() dell'oggetto callback.
  • In questo snippet di codice, l'oggetto callback viene creato dal metodo createInstallStatusCallback(). Dovresti scrivere tu stesso questo metodo, in questo modo:

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() controlla se il dispositivo e il sistema operativo Android supportano Google Low Light Boost. In caso contrario, non scaricare il modulo.

  • Il metodo LowLightBoostClient.installModule() restituisce un oggetto Task. Utilizzi questo oggetto per configurare i listener di esito positivo e negativo.

  • Al termine dell'installazione, il listener di esito positivo verifica l'installazione aprendo la videocamera. Nello snippet, questa operazione viene eseguita con una chiamata a openCamera(). Dovrai scrivere tu stesso questo metodo.