Используйте сеанс усиления при слабом освещении,Используйте сеанс усиления при слабом освещении,Используйте сеанс усиления при слабом освещении,Используйте сеанс усиления при слабом освещении

Используйте сеанс усиления при слабом освещении, чтобы включать и выключать Google Low Light Boost.

Котлин

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

Круто

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

LowLightBoostSession предоставляется пакетом com.google.android.gms.cameralowlight сервисов Google Play. Информацию о доступе к API сервисов Google Play см. в документации сервисов Google Play .

Создать объект обратного вызова

При создании сеанса усиления низкой освещенности вам необходимо передать ему объект, реализующий интерфейс LowLightBoostCallback . Функции этого объекта вызываются при отключении или уничтожении сеанса. Следующий код показывает, как создать обратный вызов:

Котлин

private fun createLowLightBoostCallback(): LowLightBoostCallback =
  object : LowLightBoostCallback() {
    override fun onSessionDestroyed() {
      Log.d(TAG, "onSessionDestroyed")
      lowLightBoostSession = null
    }

    override fun onSessionDisconnected(statusCode: Int) {
      Log.d(TAG, "onSessionDisconnected: error=$statusCode")
      lowLightBoostSession = null
    }
  }

Ява

private LowLightBoostCallback createLowLightBoostCallback() {
  LowLightBoostCallback lowLightBoostCallback = new LowLightBoostCallback() {
    @Override
    public void onSessionDestroyed() {
      Log.d(TAG, "onSessionDestroyed");
      lowLightBoostSession = null;
    }

    @Override
    public void onSessionDisconnected(int statusCode) {
      Log.d(TAG, "onSessionCreationFailed: error=" + statusCode);
      lowLightBoostSession = null;
    }
  }
  return lowLightBoostCallback;
}

Ключевые моменты этого кодекса

  • Этот код определяет частный метод createLowLightBoostCallback() , который создает объект обратного вызова. Вы вызовете этот метод, когда фактически создадите сеанс усиления низкой освещенности, как описано в разделе Создание сеанса .
  • Обратный вызов вызывается при отключении или уничтожении сеанса. Он не вызывается при создании сеанса. Чтобы проверить, был ли сеанс успешно создан, проверьте объект Task возвращаемый LowLightBoostClient.createSession .

Создать сессию

Чтобы создать сеанс низкой освещенности, вызовите метод LowLightBoostClient.createSession .

Котлин

val options = LowLightBoostOptions(
  previewSurface,
  cameraId,
  previewWidth,
  previewHeight,
  enableLowLightBoost
)

launch {
  try {
    val lowLightBoostSession = lowLightBoostClient
      .createSession(options, createLowLightBoostCallback()).await()

    Log.d(TAG, "Session created successfully")

    // Get the surface from the LLB session;
    // give it to camera so camera can write frames to it
  } catch (e: CancellationException) {
    Log.w(TAG, "Session creation was canceled", e)
    lowLightBoostSession = null
  } catch (e: ApiException) {
    Log.e(TAG, "Session creation failed with ApiException:", e)
    lowLightBoostSession = null
  } catch (e: Exception) {
    Log.e(TAG, "Session creation failed with Exception", e)
    lowLightBoostSession = null
  }
}

Ява

LowLightBoostOptions options = new LowLightBoostOptions(
  previewSurface,
  cameraId,
  previewWidth,
  previewHeight,
  enableLowLightBoost);

lowLightBoostClient
  .createSession(options, createLowLightBoostCallback())
  .addOnSuccessListener(
    lowLightBoostExecutor,
    (session) -> {
      Log.d(TAG, "Session created successfully");

      // Get the surface from the LLB session;
      // give it to camera so camera can write frames to it

    })
  .addOnFailureListener(
    lowLightBoostExecutor,
    (e) -> {
      ApiException apiException = (ApiException) e;
      Log.d(TAG, "Session creation failed: " + e);
      lowLightBoostSession = null;
    })
  .addOnCompleteListener(
    lowLightBoostExecutor,
    (task) -> Log.d(TAG, "Session creation complete"))
  .addOnCanceledListener(
    lowLightBoostExecutor,
    () -> {
      throw new RuntimeException("Session creation canceled");
    });

Ключевые моменты этого кодекса

  • Вы передаете объект LowLightBoostOptions в createSession() для настройки сеанса. Этот объект определяет такие вещи, как целевая поверхность , идентификатор используемой камеры и размеры предварительного просмотра.
  • Этот код предполагает, что вы уже открыли соединение с камерой Camera2 и использовали эту информацию для установки значений cameraId, previewWidth, previewHeight . Для получения дополнительной информации см. документацию Camera2 .
  • enableLowLightBoost — это логическое значение, указывающее, должно ли усиление при слабом освещении быть включено или выключено.
  • createLowLightBoostCallback — это метод, который вы пишете для создания объекта обратного вызова. Этот объект вызывается, когда сеанс отключается или уничтожается.
  • Метод LowLightBoostClient.createSession() возвращает объект Task . Этот объект используется для настройки прослушивателей успеха и неудачи. Захватите видео внутри прослушивателя успеха.
  • Вы можете указать Executor для запуска слушателей. Если вы не укажете Executor , слушатели будут запущены в основном потоке. В этом коде мы предполагаем, что lowLightBoostExecutor является подходящим Executor .

Начать предварительный просмотр камеры

После создания сеанса при слабом освещении вы можете запустить поток предварительного просмотра камеры. Это следует сделать внутри обратного вызова onSuccess() вы передаете сеансу при слабом освещении, как описано в разделе Создание сеанса . Следующий код показывает, как захватить видео:

Котлин

MainActivity.this.lowLightBoostSession =
  lowLightBoostSession
MainActivity.this.lowLightBoostSession
  .setSceneDetectorCallback(
    (lowLightBoostSession, boostStrength) -> {
      Log.d(TAG, "onSceneBrightnessChanged: " +
        "boostStrength=$boostStrength")
      // boostStrength > 0.5 indicates a low light scene.
      // Update UI accordingly.
    },
    lowLightBoostExecutor
  )
try {
  startCaptureSession(
    lowLightBoostSession.getCameraSurface())
    // Start a Camera2 session here. Pass the LLB surface
    // to the camera so the camera can write frames to it.
} catch (e: CameraAccessException) {
  Log.e(TAG, "Failed to start capture session", e)
  // Must try again or start the capture session without LLB.
}

Ява

MainActivity.this.lowLightBoostSession =
  lowLightBoostSession;
MainActivity.this.lowLightBoostSession
  .setSceneDetectorCallback(
    (lowLightBoostSession, boostStrength) -> {
      Log.d(TAG, "onSceneBrightnessChanged: " +
        "boostStrength=" + boostStrength);
      // boostStrength > 0.5 indicates a low light scene.
      // Update UI accordingly.
    },
    lowLightBoostExecutor
  );
try {
  startCaptureSession(
    lowLightBoostSession.getCameraSurface());
    // Start a Camera2 session here. Pass the LLB surface
    // to the camera so the camera can write frames to it.
} catch (CameraAccessException e) {
  Log.e(TAG, "Failed to start capture session", e);
  // Must try again or start the capture session without LLB.
}

Ключевые моменты этого кодекса

  • lowLightBoostSession — это сеанс, который вы создали в разделе «Создание сеанса» .
  • setSceneDetectorCallback() определяет объект обратного вызова, реализующий интерфейс SceneDetectorCallback . Сеанс вызывает метод onSceneBrightnessChanged() этого объекта при изменении яркости сцены. Ваша реализация должна соответствующим образом настроить пользовательский интерфейс камеры.
  • Вы можете указать Executor для запуска обратного вызова. Если вы не укажете Executor , обратный вызов запустится в основном потоке. В этом коде мы предполагаем, что lowLightBoostExecutor является подходящим Executor .
  • lowLightBoostSession.getCameraSurface() возвращает Surface с захваченным видео.

Освободите сессию

Когда камера больше не активна, отпустите сессию усиления низкой освещенности, вызвав LowLightBoostSession.release() . В частности, вы должны убедиться, что отпустили сессию, когда ваша активность будет уничтожена. Вы можете сделать это, вызвав метод в методе onDestroy() вашей активности:

Котлин

override protected void onDestroy() {
  super.onDestroy()
  if (lowLightBoostSession != null) {
    lowLightBoostSession.release()
    lowLightBoostSession = null
  }
}

Ява

@Override
protected void onDestroy() {
  super.onDestroy();
  if (lowLightBoostSession != null) {
    lowLightBoostSession.release();
    lowLightBoostSession = null;
  }
}

Ключевые моменты этого кодекса

  • После освобождения сессии не следует вызывать ни один из ее методов. Следует очистить все переменные, указывающие на сессию, как это делает этот код.