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

Wenn Sie den Low Light-Modus von Google verwenden möchten, benötigen Sie einen Client für den Low Light-Modus. Mit dem Client können Sie prüfen, ob das Modul für die Low-Light-Optimierung installiert ist und ob die Low-Light-Optimierung von Google vom Gerät und der Kamera unterstützt wird, auf denen Ihre App ausgeführt wird. Außerdem verwenden Sie den Client, um ein LowLightBoostSession zu erstellen. (Sie verwenden die Sitzung, um die Optimierung bei wenig Licht ein- und auszuschalten.) Sie können auch einen Listener einrichten, um Callbacks zu erhalten, wenn die Funktion „Nachtmodus“ aktiv ist.

LowLightBoostClient-Methoden signalisieren Erfolg oder Misserfolg nicht direkt. Stattdessen geben sie ein Task-Objekt zurück. Sie verwenden einen Task, um Listener für Erfolg und Fehler einzurichten. So können die Methoden asynchron Erfolg oder Misserfolg 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.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 wird vom Google Play-Dienste-Paket com.google.android.gms.cameralowlight bereitgestellt. Informationen zum Zugriff auf Google Play-Dienste-APIs finden Sie in der Dokumentation zu Google Play-Diensten.

Client erstellen

Du benötigst einen Client für die Aufhellung bei schwachem Licht, um etwas anderes zu tun. 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 stellt die statische Methode getClient bereit, die eine Instanz von LowLightBoostClient zurückgibt.

Prüfen, ob der Low Light-Modus unterstützt wird

Sobald Sie einen Client haben, können Sie prüfen, ob die Low-Light-Optimierung vom Gerät unterstützt wird, auf dem die App ausgeführt wird. Mit dem folgenden Code wird geprüft, ob die Aufhellung bei wenig Licht 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

  • cameraId wird als ID einer Camera2-Kamera angenommen, die an anderer Stelle erstellt wurde.
  • LowLightBoostClient.isCameraSupported() prüft, ob die Camera2-Kamera die Funktion „Nachtsicht“ unterstützt. In einigen Fällen unterstützt ein Gerät möglicherweise die Funktion „Optimierung bei schwachem Licht“, eine seiner Kameras jedoch nicht. Du musst also beides prüfen.
  • Die Methode LowLightBoostClient.isCameraSupported() gibt ein Task-Objekt zurück. Mit diesem Objekt richten Sie Erfolgs- und Fehler-Listener ein. Erstellen Sie die Sitzung für den Low Light-Modus im Success-Listener.

Prüfen, ob das Modul für die Optimierung bei wenig Licht installiert ist

Sobald du einen Client hast, kannst du prüfen, ob das Modul für die Optimierung bei wenig Licht auf deinem 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

  • Dieser Code öffnet eine Kamerasitzung, die eine Verbindung zur Kamera mit der ID cameraId herstellt. Weitere Informationen findest du in der Camera2-Dokumentation.
  • Die Methode LowLightBoostClient.isModuleInstalled() gibt ein Task-Objekt zurück. Mit diesem Objekt richten Sie Erfolgs- und Fehler-Listener ein.
  • Verwenden Sie Task.addOnSuccessListener(), um einen Listener einzurichten, der aufgerufen wird, wenn der Aufruf von isModuleInstalled() erfolgreich ist. Wenn der Erfolgs-Listener aufgerufen wird, bedeutet das nur, dass der Client erfolgreich herausgefunden hat, ob das Modul auf dem Gerät installiert ist. Im Text des Listeners müssen Sie prüfen, ob das Modul tatsächlich installiert ist.
  • Wenn das Modul noch nicht installiert ist, wird es mit diesem Snippet durch Aufrufen der Methode launchInstallRequest() installiert. Diese Methode ist im Snippet unter Modul für die Optimierung bei wenig Licht installieren definiert.

Modul für den Low Light-Modus installieren

Wenn das Modul für die Optimierung bei schlechten Lichtverhältnissen noch nicht auf dem Gerät installiert ist, müssen Sie es über die Google Play-Dienste herunterladen und installieren. Der folgende Code zeigt, wie das geht:

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 Sie LowLightBoostClient.installModule() aufrufen, übergeben Sie ein Callback-Objekt, 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 Callback-Objekts auf.
  • In diesem Code-Snippet wird das Callback-Objekt mit der 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 die Google-Funktion „Low Light Boost“ unterstützen. Andernfalls laden Sie das Modul nicht herunter.

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

  • Nach Abschluss der Installation wird sie vom Erfolgs-Listener überprüft, indem die Kamera geöffnet wird. Im Snippet erfolgt dies durch einen Aufruf von openCamera(). Diese Methode müssen Sie selbst schreiben.