Используйте сеанс усиления при слабом освещении, чтобы включать и выключать функцию Google Low Light Boost.
Котлин
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")
}
Круто
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'
}
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
.
Передайте результаты захвата
Для Google Low Light Boost требуются определённые метаданные камеры, чтобы определить правильный уровень яркости. Необходимо передать TotalCaptureResult
методу processCaptureResult()
. Получить TotalCaptureResult
можно в методе обратного вызова onCaptureCompleted()
.
Котлин
val captureCallback = CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(
session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult
) {
super.onCaptureCompleted(session, request, result)
lowLightBoostSession?.processCaptureResult(result)
}
}
Ява
CameraCaptureSession.CaptureCallback captureCallback =
new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(
@NonNull CameraCaptureSession session,
@NonNull CaptureRequest request,
@NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result)
if (lowLightBoostSession != null) {
lowLightBoostSession.processCaptureResult(result);
}
}
};
Ключевые моменты этого кода
- Этот код отображает только код
CaptureCallback
, относящийся к Google LLB. Скорее всего, в этих обратных вызовах будет присутствовать и другой код. - Передача
TotalCaptureResult
позволяет Google LLB анализировать данные автоматической экспозиции и другие метаданные, необходимые для усиления экспозиции при слабом освещении, чтобы обрабатывать обнаружение сцены и определять, какое усиление следует применить к кадру. - При создании сеанса камеры необходимо передать объект
captureCallback
, например, с помощью ` setSingleRepeatingRequest() .
Начать предварительный просмотр камеры
После создания сеанса при слабом освещении можно запустить поток предварительного просмотра с камеры. Это следует сделать внутри обратного вызова 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;
}
}
Ключевые моменты этого кода
- После завершения сеанса не следует вызывать никакие его методы. Следует очистить все переменные, указывающие на сеанс, как это делает этот код.