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

Используйте сеанс усиления при слабом освещении, чтобы включать и выключать 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 предоставляется пакетом сервисов Google Play com.google.android.gms.cameralowlight . Информацию о доступе к 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;
  }
}

Ключевые моменты об этом коде

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

Используйте сеанс усиления при слабом освещении, чтобы включать и выключать 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 предоставляется пакетом сервисов Google Play com.google.android.gms.cameralowlight . Информацию о доступе к 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;
  }
}

Ключевые моменты об этом коде

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

Используйте сеанс усиления при слабом освещении, чтобы включать и выключать 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 предоставляется пакетом сервисов Google Play com.google.android.gms.cameralowlight . Информацию о доступе к 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;
  }
}

Ключевые моменты об этом коде

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

Используйте сеанс усиления при слабом освещении, чтобы включать и выключать 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 предоставляется пакетом сервисов Google Play com.google.android.gms.cameralowlight . Информацию о доступе к 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;
  }
}

Ключевые моменты об этом коде

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