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

Per utilizzare la modalità scarsa illuminazione di Google, ti serve un client per la modalità scarsa illuminazione. Puoi utilizzare il client per verificare se il modulo della modalità scarsa illuminazione è installato e per verificare se la modalità scarsa illuminazione di Google è supportata dal dispositivo e dalla videocamera su cui è in esecuzione l'app. Utilizzerai il client anche per creare un oggetto LowLightBoostSession. (Utilizzerai la sessione per attivare e disattivare la modalità scarsa illuminazione.) Puoi anche configurare un listener per ricevere callback quando la modalità scarsa illuminazione è attiva.

consulta la documentazione di Google Play Services.

LowLightBoostClient metodi non segnalano direttamente l'esito positivo o negativo. Restituiscono invece un oggetto Task. Utilizza un oggetto Task per configurare i listener di esito positivo e negativo. In questo modo, i metodi possono segnalare l'esito positivo o negativo in modo asincrono, il che è necessario perché 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 di Google Play Services com.google.android.gms.cameralowlight. Per informazioni su come accedere alle API di Google Play services, consulta la documentazione di Google Play services.

Crea un client

Per eseguire qualsiasi altra operazione, ti serve un client per la modalità scarsa illuminazione. Il seguente codice crea un client:

Kotlin

val lowLightBoostClient = LowLightBoost.getClient(context)

Java

LowLightBoostClient lowLightBoostClient = LowLightBoost.getClient(context);

Punti chiave su questo codice

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

Verifica se la modalità scarsa illuminazione è supportata

Una volta che hai un client, puoi verificare se la modalità scarsa illuminazione è supportata dal dispositivo su cui è in esecuzione l'app. Il seguente codice verifica se la modalità scarsa illuminazione è supportata:

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 su questo codice

Verifica se il modulo della modalità scarsa illuminazione è installato

Una volta che hai un client, puoi verificare se il modulo della modalità scarsa illuminazione è installato sul 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 su questo codice

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

Installa il modulo della modalità scarsa illuminazione

Se il modulo della modalità scarsa illuminazione non è già installato sul dispositivo, devi scaricarlo e installarlo da Google Play Services. Questo codice mostra come farlo:

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 su questo codice

  • Quando chiami LowLightBoostClient.installModule() passi un oggetto callback che implementa LowLightBoostClient.InstallStatusCallback. installModule() chiama i metodi in questo 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 callback viene creato dal createInstallStatusCallback() metodo. Dovrai scrivere tu stesso questo metodo, seguendo queste indicazioni:

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 il dispositivo e il sistema operativo Android supportano la modalità scarsa illuminazione di Google. In caso contrario, non scaricare il modulo.

  • Il metodo LowLightBoostClient.installModule() restituisce un oggetto Task. Utilizza 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.