Tworzenie i używanie klienta do wzmocnienia w warunkach słabego oświetlenia

Aby korzystać z automatycznej ekspozycji w trybie słabego oświetlenia, musisz mieć klienta automatycznej ekspozycji w trybie słabego oświetlenia. Za pomocą klienta możesz sprawdzić, czy moduł wzmocnienia obrazu przy słabym oświetleniu jest zainstalowany oraz czy urządzenie i aparat, na których działa aplikacja, obsługują wzmocnienie obrazu przy słabym oświetleniu od Google. Użyjesz też klienta do utworzenia LowLightBoostSession. (Użyjesz sesji, aby włączyć i wyłączyć ulepszoną ekspozycję przy słabym oświetleniu). Możesz też skonfigurować detektor, aby otrzymywać wywołania zwrotne, gdy aktywne jest wzmocnienie przy słabym oświetleniu.

Metody LowLightBoostClient nie sygnalizują bezpośrednio sukcesu ani niepowodzenia. Zamiast tego zwracają obiekt Task. Do skonfigurowania detektorów sukcesu i niepowodzenia używasz obiektu Task. Dzięki temu metody mogą asynchronicznie sygnalizować powodzenie lub niepowodzenie, co jest konieczne, ponieważ metody muszą komunikować się z usługami Google Play.

Zależności

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

Dynamiczny

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 jest dostarczany przez pakiet Usług Google Play com.google.android.gms.cameralowlight. Informacje o uzyskiwaniu dostępu do interfejsów API usług Google Play znajdziesz w dokumentacji usług Google Play.

Tworzenie klienta

Aby wykonać inne czynności, musisz mieć klienta ulepszenia obrazu przy słabym oświetleniu. Poniższy kod tworzy klienta:

Kotlin

val lowLightBoostClient = LowLightBoost.getClient(context)

Java

LowLightBoostClient lowLightBoostClient = LowLightBoost.getClient(context);

Najważniejsze informacje o tym kodzie

Sprawdzanie, czy funkcja słabego oświetlenia jest obsługiwana

Gdy masz klienta, możesz sprawdzić, czy urządzenie, na którym działa aplikacja, obsługuje wzmocnienie obrazu przy słabym oświetleniu. Poniższy kod sprawdza, czy funkcja wzmocnienia słabego oświetlenia jest obsługiwana:

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

Najważniejsze informacje o tym kodzie

Sprawdzanie, czy moduł wzmocnienia obrazu przy słabym oświetleniu jest zainstalowany

Gdy masz klienta, możesz sprawdzić, czy na urządzeniu jest zainstalowany moduł wzmocnienia obrazu przy słabym oświetleniu. Poniższy kod sprawdza, czy moduł jest zainstalowany:

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

Najważniejsze informacje o tym kodzie

  • Ten kod otwiera sesję kamery, łącząc się z kamerą o identyfikatorze cameraId. Więcej informacji znajdziesz w dokumentacji Camera2.
  • Metoda LowLightBoostClient.isModuleInstalled() zwraca obiekt Task. Za pomocą tego obiektu możesz skonfigurować detektory sukcesu i niepowodzenia.
  • Użyj metody Task.addOnSuccessListener(), aby skonfigurować detektor, który jest wywoływany, gdy wywołanie metody isModuleInstalled() się powiedzie. Co ważne, wywołanie detektora sukcesu oznacza tylko, że klientowi udało się ustalić, czy moduł jest zainstalowany na urządzeniu. W treści detektora musisz sprawdzić, czy moduł jest zainstalowany.
  • Jeśli moduł nie jest jeszcze zainstalowany, ten fragment kodu instaluje go, wywołując metodę launchInstallRequest(). Ta metoda jest zdefiniowana we fragmencie kodu w sekcji Instalowanie modułu wzmocnienia obrazu przy słabym oświetleniu.

Instalowanie modułu ulepszania obrazu przy słabym oświetleniu

Jeśli moduł ulepszania obrazu przy słabym oświetleniu nie jest jeszcze zainstalowany na urządzeniu, musisz go pobrać i zainstalować z usług Google Play. Ten kod pokazuje, jak to zrobić:

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

Najważniejsze informacje o tym kodzie

  • Gdy wywołujesz metodę LowLightBoostClient.installModule(), przekazujesz obiekt wywołania zwrotnego, który implementuje interfejs LowLightBoostClient.InstallStatusCallback. installModule() wywołuje metody w tym wywołaniu zwrotnym, aby wskazać stan pobierania. Jeśli na przykład pobieranie zostanie wstrzymane, installModule() wywołuje metodę onDownloadPause() obiektu wywołania zwrotnego.
  • W tym fragmencie kodu obiekt wywołania zwrotnego jest tworzony przez metodę createInstallStatusCallback(). Musisz samodzielnie napisać tę metodę, na przykład w ten sposób:

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() sprawdza, czy urządzenie z Androidem i system operacyjny obsługują funkcję Google Low Light Boost. Jeśli nie, nie pobieraj modułu.

  • Metoda LowLightBoostClient.installModule() zwraca obiekt Task. Za pomocą tego obiektu możesz skonfigurować detektory sukcesu i niepowodzenia.

  • Po zakończeniu instalacji detektor powodzenia weryfikuje instalację, otwierając aparat. We fragmencie kodu odbywa się to przez wywołanie openCamera(). Musisz samodzielnie napisać tę metodę.