Client für den Modus „Bei wenig Licht“ erstellen und verwenden

Wenn Sie den Modus für wenig Licht von Google verwenden möchten, benötigen Sie einen Client für den Modus für wenig Licht. Sie können mit dem Client prüfen, ob das Modul für die Verbesserung bei schlechten Lichtverhältnissen installiert ist, und ob die Funktion von Google für das Gerät und die Kamera unterstützt wird, auf dem bzw. der Ihre App ausgeführt wird. Außerdem erstellen Sie damit eine LowLightBoostSession. In der Sitzung können Sie die Funktion für die Verbesserung bei schlechten Lichtverhältnissen aktivieren und deaktivieren. Sie können auch einen Listener einrichten, um Rückrufe zu erhalten, wenn die Funktion „Boost bei schlechten Lichtverhältnissen“ aktiv ist.

LowLightBoostClient-Methoden geben keinen direkten Hinweis auf Erfolg oder Misserfolg. Stattdessen geben sie ein Task-Objekt zurück. Mit einem Task können Sie Erfolgs- und Fehler-Listener einrichten. So können die Methoden Erfolg oder Misserfolg asynchron signalisieren, was erforderlich ist, da die Methoden mit den Google Play-Diensten kommunizieren müssen.

Abhängigkeiten

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 wird vom Paket „Google Play-Dienste“ com.google.android.gms.cameralowlight bereitgestellt. In der Dokumentation zu den Google Play-Diensten finden Sie Informationen zum Zugriff auf APIs der Google Play-Dienste.

Client erstellen

Für alle anderen Zwecke benötigen Sie einen Client mit Low Light Boost. Mit dem folgenden Code wird ein Client erstellt:

Kotlin

val lowLightBoostClient = LowLightBoost.getClient(context)

Java

LowLightBoostClient lowLightBoostClient = LowLightBoost.getClient(context);

Wichtige Punkte zu diesem Code

  • Die Klasse LowLightBoost bietet die statische Methode getClient, die eine Instanz von LowLightBoostClient zurückgibt.

Prüfen, ob das Modul für den Boost bei wenig Licht installiert ist

Sobald Sie einen Kunden haben, können Sie prüfen, ob das Modul für die Verbesserung bei schlechten Lichtverhältnissen auf Ihrem Gerät installiert ist. Mit dem folgenden Code wird geprüft, ob das Modul installiert ist:

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

Wichtige Punkte zu diesem Code

  • Mit diesem Code wird eine Kamerasitzung geöffnet, die eine Verbindung zur Kamera herstellt, die durch cameraId gekennzeichnet ist. Weitere Informationen finden Sie in der Camera2-Dokumentation.
  • Die Methode LowLightBoostClient.isModuleInstalled() gibt ein Task-Objekt zurück. Mit diesem Objekt richten Sie Erfolgs- und Fehler-Listener ein.
  • Mit Task.addOnSuccessListener() kannst du einen Listener einrichten, der aufgerufen wird, wenn der Aufruf von isModuleInstalled() erfolgreich war. Wenn der Erfolgs-Listener aufgerufen wird, bedeutet das nur, dass der Client herausgefunden hat, ob das Modul auf dem Gerät installiert ist. Im Body des Listeners musst du prüfen, ob das Modul tatsächlich installiert ist.
  • Wenn das Modul noch nicht installiert ist, wird es durch Aufrufen der Methode launchInstallRequest() installiert. Diese Methode wird im Snippet unter Low Light Boost-Modul installieren definiert.

Modus für wenig Licht an

Wenn das Modul für die Verbesserung bei schlechten Lichtverhältnissen noch nicht auf dem Gerät installiert ist, müssen Sie es über die Google Play-Dienste herunterladen und installieren. So gehts:

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

Wichtige Punkte zu diesem Code

  • Wenn du LowLightBoostClient.installModule() aufrufst, musst du ein Callback-Objekt übergeben, das LowLightBoostClient.InstallStatusCallback implementiert. installModule() ruft Methoden in diesem Callback auf, um den Status des Downloads anzugeben. Wenn der Download beispielsweise pausiert wird, ruft installModule() die Methode onDownloadPause() des Rückrufobjekts auf.
  • In diesem Code-Snippet wird das Callback-Objekt durch die Methode createInstallStatusCallback() erstellt. Sie müssten diese Methode selbst schreiben, etwa so:

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()prüft, ob das Android-Gerät und das Betriebssystem Google Low Light Boost unterstützen. Andernfalls sollten Sie das Modul nicht herunterladen.

  • Die Methode LowLightBoostClient.installModule() gibt ein Task-Objekt zurück. Mit diesem Objekt richten Sie Erfolgs- und Fehler-Listener ein.

  • Nach Abschluss der Installation prüft der Erfolgsempfänger die Installation, indem er die Kamera öffnet. Im Snippet geschieht dies mit einem Aufruf von openCamera(). Sie müssen diese Methode selbst schreiben.

Prüfen, ob der Modus bei wenig Licht unterstützt wird

Sobald Sie einen Kunden haben, können Sie prüfen, ob die Funktion „Boost bei schlechten Lichtverhältnissen“ vom Gerät unterstützt wird, auf dem die App ausgeführt wird. Im folgenden Code wird geprüft, ob die Funktion „Boost bei schlechten Lichtverhältnissen“ unterstützt wird:

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

Wichtige Punkte zu diesem Code

  • Es wird davon ausgegangen, dass cameraId die ID einer Camera2-Kamera ist, die an anderer Stelle erstellt wurde.
  • LowLightBoostClient.isCameraSupported()prüft, ob die Camera2-Kamera die Funktion „Boost bei schlechten Lichtverhältnissen“ unterstützt. In einigen Fällen unterstützt ein Gerät die Funktion „Steigerung bei schlechten Lichtverhältnissen“, eine seiner Kameras jedoch nicht. Sie müssen also beide prüfen.
  • Die Methode LowLightBoostClient.isCameraSupported() gibt ein Task-Objekt zurück. Mit diesem Objekt richten Sie Erfolgs- und Fehler-Listener ein. Erstelle die Sitzung für den Modus für wenig Licht im Erfolgs-Listener.