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

Per utilizzare l'aumento luce di Google, devi avere un client di aumento luce. Puoi utilizzare il client per verificare se il modulo di miglioramento in condizioni di scarsa illuminazione è installato e se la funzionalità di miglioramento in condizioni di scarsa illuminazione di Google è supportata dal dispositivo e dalla fotocamera su cui è in esecuzione l'app. Utilizzerai il client anche per creare un LowLightBoostSession. Utilizzerai la sessione per attivare e disattivare il miglioramento in condizioni di scarsa illuminazione. Puoi anche impostare un ascoltatore per ricevere chiamate di ritorno quando l'aumento della luminosità è attivo.

I metodi LowLightBoostClient non segnalano direttamente il successo o l'errore. Invece, restituisce un oggetto Task. Utilizzi un Task per configurare gli ascoltatori di successo e errore. In questo modo i metodi possono segnalare l'esito positivo o negativo in modo asincrono, il che è necessario poiché i metodi devono comunicare con Google Play Services.

Dipendenze

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

Crea un client

Per eseguire altre operazioni, devi avere un client di aumento della luminosità 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.

Controlla se il modulo di aumento della luminosità è installato

Una volta ottenuto un cliente, puoi verificare se il modulo di aumento della luminosità è installato sul tuo dispositivo. Il seguente codice verifica 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 dacameraId. Per ulteriori informazioni, consulta la documentazione di Camera2.
  • Il metodo LowLightBoostClient.isModuleInstalled() restituisce un oggetto Task. Utilizza questo oggetto per configurare gli ascoltatori di successo e di errore.
  • Utilizza Task.addOnSuccessListener() per configurare un listener che viene chiamato se la chiamata a isModuleInstalled() ha esito positivo. È importante sottolineare che, se viene chiamato l'ascoltatore di eventi di successo, significa semplicemente che il client è riuscito a scoprire se il modulo è installato sul dispositivo. Nel corpo dell'ascoltatore, 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 Installa il modulo di potenziamento in condizioni di luce scarsa.

Installa il modulo di aumento della luminosità

Se il modulo di potenziamento in condizioni di scarsa illuminazione non è già installato sul dispositivo, dovrai scaricarlo e installarlo da Google Play Services. Questo codice mostra come fare:

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() devi passare un oggetto callback che implementa LowLightBoostClient.InstallStatusCallback. installModule() chiama i metodi in quel callback per indicare lo stato del download. Ad esempio, se il download è in pausa, installModule() chiama il metodo onDownloadPause() dell'oggetto callback.
  • In questo snippet di codice, l'oggetto di callback viene creato dal metodo createInstallStatusCallback(). Dovrai scrivere questo metodo da solo, seguendo queste linee guida:

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 la funzionalità Google Low Light Boost. In caso contrario, non scaricare il modulo.

  • Il metodo LowLightBoostClient.installModule() restituisce un oggetto Task. Utilizza questo oggetto per configurare gli ascoltatori di successo e di errore.

  • Al termine dell'installazione, l'ascoltatore di eventi di successo verifica l'installazione aprendo la videocamera. Nello snippet, questa operazione viene eseguita con una chiamata a openCamera(). Dovrai scrivere questo metodo autonomamente.

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

Una volta ottenuto un cliente, puoi verificare se il potenziamento in condizioni di scarsa illuminazione è supportato dal dispositivo su cui è in esecuzione l'app. Il seguente codice verifica se l'aumento della luminosità è 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

  • Si presume che cameraId sia l'ID di una videocamera Camera2, creata altrove.
  • LowLightBoostClient.isCameraSupported() controlla se la fotocamera Camera2 supporta l'aumento della sensibilità in condizioni di scarsa illuminazione. In alcuni casi, un dispositivo potrebbe supportare l'aumento della luminosità, ma una delle sue fotocamere potrebbe non farlo, quindi devi controllare entrambi.
  • Il metodo LowLightBoostClient.isCameraSupported() restituisce un oggetto Task. Utilizza questo oggetto per configurare gli ascoltatori di successo e di errore. Crea la sessione di aumento della luce all'interno dell'ascoltatore di eventi di successo.