Użyj sesji wzmocnienia przy słabym oświetleniu, aby włączyć i wyłączyć funkcję wzmocnienia przy słabym oświetleniu.
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")
}
Groovy
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 udostępniana przez pakiet Usług Google Play
com.google.android.gms.cameralowlight
. Informacje o uzyskiwaniu dostępu do interfejsów API Usług Google Play znajdziesz w dokumentacji Usług Google Play.
Tworzenie obiektu wywołania zwrotnego
Podczas tworzenia sesji wzmocnienia przy słabym oświetleniu musisz przekazać do niej obiekt, który implementuje interfejs LowLightBoostCallback
.
Funkcje tego obiektu są wywoływane, gdy sesja zostanie odłą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ę, gdy utworzysz sesję wzmocnienia przy 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 ona wywoływana podczas tworzenia sesji. Aby sprawdzić, czy sesja została utworzona, zbadaj obiekt
Task
zwrócony przezLowLightBoostClient.createSession
.
Tworzenie sesji
Aby utworzyć sesję przy 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
LowLightBoostOptions
docreateSession()
. Ten obiekt określa takie elementy jak powierzchnia docelowa, identyfikator kamery do użycia i 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 wzmocnienie przy słabym oświetleniu ma być włączone czy wyłączone.createLowLightBoostCallback
to metoda, którą piszesz, aby utworzyć obiekt wywołania zwrotnego. Ten obiekt jest wywoływany, gdy sesja zostanie odłączona lub zniszczona.- Metoda
LowLightBoostClient.createSession()
zwraca obiektTask
. Używasz tego obiektu do konfigurowania odbiorników sukcesu i niepowodzenia. Zrób zdjęcie w funkcji nasłuchiwania zdarzenia powodzenia. - Możesz określić
Executor
, aby uruchamiać odbiorniki. Jeśli nie określiszExecutor
, odbiorniki będą działać w wątku głównym. W tym kodzie zakładamy, żelowLightBoostExecutor
jest odpowiednimExecutor
.
Przekazywanie wyników przechwytywania
Aby określić odpowiednią wartość rozjaśnienia, funkcja Google Low Light Boost potrzebuje określonych metadanych aparatu. Musisz przekazać parametr TotalCaptureResult
do metody processCaptureResult()
. Wartość TotalCaptureResult
możesz uzyskać 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 wyświetla tylko kod
CaptureCallback
odpowiedni dla Google LLB. W tych wywołaniach zwrotnych prawdopodobnie będziesz mieć inny kod. - Przekazywanie wartości
TotalCaptureResult
umożliwia Google LLB analizowanie danych automatycznej ekspozycji i innych metadanych, które są niezbędne do przetwarzania wykrywania sceny i określania, jak bardzo należy wzmocnić klatkę. - Podczas tworzenia sesji aparatu należy przekazać obiekt
captureCallback
, np. za pomocą funkcji setSingleRepeatingRequest().
Uruchamianie podglądu z kamery
Po utworzeniu sesji przy słabym oświetleniu możesz uruchomić strumień podglądu z kamery. Należy to zrobić w onSuccess()
wywołaniu zwrotnym przekazywanym do sesji przy słabym oświetleniuonSuccess()
, zgodnie z opisem w sekcji Tworzenie sesji. Poniższy kod pokazuje, jak nagrać 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
. Sesja wywołuje metodęonSceneBrightnessChanged()
tego obiektu, gdy zmienia się jasność sceny. Wdrożenie powinno odpowiednio dostosować interfejs kamery.- Możesz określić
Executor
, aby uruchomić wywołanie zwrotne. Jeśli nie określiszExecutor
, wywołanie zwrotne zostanie wykonane w głównym wątku. W tym kodzie zakładamy, żelowLightBoostExecutor
jest odpowiednimExecutor
. lowLightBoostSession.getCameraSurface()
zwracaSurface
z nagranym filmem.
Zakończ sesję
Gdy kamera nie jest już aktywna, zakończ sesję wzmocnienia przy słabym oświetleniu, wywołując funkcję LowLightBoostSession.release()
. Pamiętaj w szczególności, aby zwolnić sesję, gdy Twoja 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 sesję, tak jak w tym kodzie.