Używaj sesji wzmocnienia w słabym oświetleniu, aby włączać i wyłączać funkcję Google Low Light Boost.
Kotlin
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")
}
Groovy
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
jest udostępniany w ramach pakietu com.google.android.gms.cameralowlight
Usługi Google Play. Więcej informacji o dostępie do interfejsów API Usług Google Play znajdziesz w dokumentacji Usług Google Play.
Tworzenie obiektu wywołania zwrotnego
Podczas tworzenia sesji wzmocnienia w warunkach słabego oświetlenia musisz przekazać obiekt, który implementuje interfejs LowLightBoostCallback
.
Funkcje tego obiektu są wywoływane, gdy sesja zostanie rozłączona lub zniszczona. Ten kod pokazuje, jak utworzyć wywołanie zwrotne:
Kotlin
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
}
}
Java
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;
}
Najważniejsze informacje o tym kodzie
- Ten kod definiuje prywatną metodę
createLowLightBoostCallback()
, która tworzy obiekt wywołania zwrotnego. Wywołujesz tę metodę, gdy tworzysz sesję wzmocnienia w warunkach słabego oświetlenia, zgodnie z opisem w sekcji Tworzenie sesji. - Wywołanie zwrotne jest wywoływane, gdy sesja zostanie rozłączona lub zniszczona. Nie jest wywoływana podczas tworzenia sesji. Aby sprawdzić, czy sesja została utworzona, sprawdź obiekt
Task
zwrócony przezLowLightBoostClient.createSession
.
Tworzenie sesji
Aby utworzyć sesję w trybie słabego oświetlenia, wywołaj metodę
LowLightBoostClient.createSession
.
Kotlin
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
}
}
Java
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");
});
Najważniejsze informacje o tym kodzie
- Do obiektu
createSession()
przekazujesz obiektLowLightBoostOptions
, aby skonfigurować sesję. Ten obiekt określa takie elementy jak docelowa powierzchnia, identyfikator kamery do użycia oraz wymiary podglądu. - Ten kod zakłada, że masz już otwarte połączenie z aparatem Camera2 i używasz tych informacji do ustawiania wartości
cameraId, previewWidth, previewHeight
. Więcej informacji znajdziesz w dokumentacji Camera2. enableLowLightBoost
to wartość logiczna określająca, czy funkcja wzmocnienia w warunkach słabego oświetlenia powinna być włączona, czy wyłączona.createLowLightBoostCallback
to metoda, którą piszesz, aby utworzyć obiekt wywołania zwrotnego. Ten obiekt jest wywoływany, gdy sesja zostanie rozłączona lub zniszczona.- Metoda
LowLightBoostClient.createSession()
zwraca obiektTask
. Używasz tego obiektu do konfigurowania odbiorników sukcesu i błędu. Nagrywaj film w obiekcie success listener. - Możesz podać
Executor
, aby uruchomić odbiorców. Jeśli nie określisz parametruExecutor
, odsłuchi będą działać w wątku głównym. W tym kodzie załóżmy, żelowLightBoostExecutor
jest odpowiednimExecutor
.
Uruchom podgląd z aparatu
Po utworzeniu sesji w przyciemnionym pomieszczeniu możesz rozpocząć transmisję podglądu kamery. Należy to zrobić w ramach wywołania zwrotnego onSuccess()
przekazywanego do sesji w warunkach słabego oświetlenia, zgodnie z opisem w artykule Tworzenie sesji. Poniższy kod pokazuje, jak nagrywać film:
Kotlin
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.
}
Java
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.
}
Najważniejsze informacje o tym kodzie
lowLightBoostSession
to sesja utworzona w sekcji Tworzenie sesji.setSceneDetectorCallback()
definiuje obiekt wywołania zwrotnego implementujący interfejsSceneDetectorCallback
. Gdy jasność sceny się zmienia, sesja wywołuje metodęonSceneBrightnessChanged()
obiektu. Implementacja powinna odpowiednio dostosować interfejs aparatu.- Aby wywołać funkcję wywołania zwrotnego, możesz podać parametr
Executor
. Jeśli nie określisz parametruExecutor
, wywołanie zwrotne zostanie wykonane w wątku głównym. W tym kodzie załóżmy, żelowLightBoostExecutor
jest odpowiednimExecutor
. lowLightBoostSession.getCameraSurface()
zwracaSurface
z nagraniem wideo.
Zakończ sesję
Gdy kamera przestanie być aktywna, zakończ sesję wzmocnienia w warunkach słabego oświetlenia, wywołując LowLightBoostSession.release()
. W szczególności musisz pamiętać o zwolnieniu sesji po zakończeniu działania. Możesz to zrobić, wywołując metodę onDestroy()
w swojej aktywności:
Kotlin
override protected void onDestroy() {
super.onDestroy()
if (lowLightBoostSession != null) {
lowLightBoostSession.release()
lowLightBoostSession = null
}
}
Java
@Override
protected void onDestroy() {
super.onDestroy();
if (lowLightBoostSession != null) {
lowLightBoostSession.release();
lowLightBoostSession = null;
}
}
Najważniejsze informacje o tym kodzie
- Po zakończeniu sesji nie należy wywoływać żadnej z jej metod. Należy usunąć wszystkie zmienne wskazujące na sesję, tak jak to robi ten kod.