Użyj sesji wzmocnienia w słabym oświetleniu, aby włączyć i wyłączyć wzmocnienie w słabym oświetleniu od Google.
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'
}
LowLightBoostSession jest dostępna w pakiecie
com.google.android.gms.cameralowlight w ramach Usług Google Play. Informacje 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 słabym oświetleniu musisz przekazać do niej obiekt, który implementuje interfejs LowLightBoostCallback.
Funkcje tego obiektu są wywoływane, gdy sesja zostanie rozłączona lub zniszczona. Poniższy 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 metodę prywatną
createLowLightBoostCallback(), która tworzy obiekt wywołania zwrotnego. Wywołasz tę metodę podczas tworzenia sesji wzmocnienia w słabym oświetleniu, zgodnie z opisem w sekcji Tworzenie sesji. - Wywołanie zwrotne jest wywoływane, gdy sesja zostanie rozłączona lub zniszczona. Nie jest wywoływane, gdy sesja zostanie utworzona. Aby sprawdzić, czy sesja została
utworzona, sprawdź obiekt
Taskzwrócony przezLowLightBoostClient.createSession.
Tworzenie sesji
Aby utworzyć sesję w słabym oświetleniu, 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
- Aby skonfigurować sesję, przekaż obiekt
LowLightBoostOptionsdocreateSession()to. Ten obiekt określa m.in. powierzchnię docelową target surface, identyfikator aparatu, który ma być używany, oraz wymiary podglądu. - Ten kod zakłada, że masz już otwarte połączenie z aparatem Camera2,
i używasz tych informacji do ustawienia wartości
cameraId, previewWidth, previewHeight. Więcej informacji znajdziesz w dokumentacji Camera2. enableLowLightBoostto wartość logiczna określająca, czy wzmocnienie w słabym oświetleniu ma być włączone czy wyłączone.createLowLightBoostCallbackto 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 niepowodzenia. Przechwyć film w odbiorniku sukcesu. - Możesz określić
Executor, aby uruchomić odbiorniki. Jeśli nie określiszExecutor, odbiorniki będą działać w wątku głównym. W tym kodzie, zakładamy, żelowLightBoostExecutorjest odpowiednimExecutor.
Przekazywanie wyników przechwytywania
Wzmocnienie w słabym oświetleniu od Google potrzebuje określonych metadanych aparatu, aby wiedzieć, jakiego rozjaśnienia użyć. Musisz przekazać TotalCaptureResult do
processCaptureResult() metody. Możesz uzyskać TotalCaptureResult w
metodzie wywołania zwrotnego onCaptureCompleted().
Kotlin
val captureCallback = CameraCaptureSession.CaptureCallback() {
override fun onCaptureCompleted(
session: CameraCaptureSession,
request: CaptureRequest,
result: TotalCaptureResult
) {
super.onCaptureCompleted(session, request, result)
lowLightBoostSession?.processCaptureResult(result)
}
}
Java
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);
}
}
};
Najważniejsze informacje o tym kodzie
- Ten kod pokazuje tylko kod
CaptureCallbackzwiązany z wzmocnieniem w słabym oświetleniu od Google. W tych wywołaniach zwrotnych prawdopodobnie będziesz mieć inny kod. - Przekazanie
TotalCaptureResultumożliwia wzmocnieniu w słabym oświetleniu od Google analizowanie danych automatycznej ekspozycji i innych metadanych, które są niezbędne do przetwarzania wykrywania sceny i określania, jakiego wzmocnienia użyć w przypadku klatki. - Podczas tworzenia sesji aparatu należy przekazać obiekt
captureCallback, na przykład za pomocą setSingleRepeatingRequest().
Uruchamianie podglądu z aparatu
Po utworzeniu sesji w słabym oświetleniu możesz uruchomić strumień podglądu z aparatu. Powinno się to zrobić
w wywołaniu zwrotnym onSuccess(), które przekazujesz do sesji w słabym oświetleniu, zgodnie z
opisem w sekcji Tworzenie sesji. Poniższy kod pokazuje, jak nagrywać filmy:
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
lowLightBoostSessionto sesja utworzona w sekcji Tworzenie sesji.setSceneDetectorCallback()definiuje obiekt wywołania zwrotnego implementujący interfejsSceneDetectorCallback. Gdy zmieni się jasność sceny, sesja wywoła metodę tego obiektuonSceneBrightnessChanged(). Twoja implementacja powinna odpowiednio dostosować interfejs aparatu.- Możesz określić
Executor, aby uruchomić wywołanie zwrotne. Jeśli nie określiszExecutor, wywołanie zwrotne będzie działać w wątku głównym. W tym kodzie, zakładamy, żelowLightBoostExecutorjest odpowiednimExecutor. lowLightBoostSession.getCameraSurface()zwracaSurfacez przechwyconym filmem.
Zwalnianie sesji
Gdy aparat nie jest już aktywny, zwolnij sesję wzmocnienia w słabym oświetleniu, wywołując LowLightBoostSession.release(). W szczególności należy zwolnić sesję, gdy aktywność zostanie zniszczona. Możesz to zrobić, wywołując metodę w metodzie onDestroy() 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 zwolnieniu sesji nie należy wywoływać żadnych jej metod. Należy wyczyścić wszystkie zmienne wskazujące na sesję, tak jak w tym kodzie.