Utilisez une session d'amplification de la luminosité faible pour activer et désactiver l'amplification de la luminosité faible de 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")
}
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
est fourni par le package com.google.android.gms.cameralowlight
des services Google Play. Pour en savoir plus sur l'accès aux API des services Google Play, consultez la documentation des services Google Play.
Créer un objet de rappel
Lorsque vous créez la session d'amélioration de la luminosité en basse lumière, vous devez lui transmettre un objet qui implémente l'interface LowLightBoostCallback
.
Les fonctions de cet objet sont appelées lorsque la session est déconnectée ou détruite. Le code suivant montre comment créer un rappel :
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;
}
Points clés concernant ce code
- Ce code définit une méthode privée,
createLowLightBoostCallback()
, qui crée l'objet de rappel. Vous appellerez cette méthode lorsque vous créerez réellement la session d'amélioration de la luminosité, comme décrit dans Créer une session. - Le rappel est appelé lorsque la session est déconnectée ou détruite. Il n'est pas appelé lors de la création de la session. Pour vérifier si la session a été créée, examinez l'objet
Task
renvoyé parLowLightBoostClient.createSession
.
Créer une session
Pour créer une session en basse luminosité, appelez la méthode 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");
});
Points clés concernant ce code
- Vous transmettez un objet
LowLightBoostOptions
àcreateSession()
pour configurer la session. Cet objet spécifie des éléments tels que la surface cible, l'ID de la caméra à utiliser et les dimensions de l'aperçu. - Ce code suppose que vous avez déjà ouvert une connexion à une caméra Camera2 et utilisé ces informations pour définir les valeurs de
cameraId, previewWidth, previewHeight
. Pour en savoir plus, consultez la documentation Camera2. enableLowLightBoost
est une valeur booléenne indiquant si l'amplification en basse luminosité doit être activée ou désactivée.createLowLightBoostCallback
est une méthode que vous écrivez pour créer l'objet de rappel. Cet objet est appelé lorsque la session est déconnectée ou détruite.- La méthode
LowLightBoostClient.createSession()
renvoie un objetTask
. Vous utilisez cet objet pour configurer des écouteurs de réussite et d'échec. Capturez la vidéo dans l'écouteur de réussite. - Vous pouvez spécifier un
Executor
pour exécuter les écouteurs. Si vous ne spécifiez pas deExecutor
, les écouteurs s'exécutent sur le thread principal. Dans ce code, nous supposons quelowLightBoostExecutor
est unExecutor
approprié.
Transmettre les résultats de la capture
L'amplification de la luminosité de Google a besoin de certaines métadonnées de l'appareil photo pour connaître la quantité d'éclaircissement à appliquer. Vous devez transmettre TotalCaptureResult
à la méthode processCaptureResult()
. Vous pouvez obtenir le TotalCaptureResult
dans la méthode de rappel 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);
}
}
};
Points clés concernant ce code
- Ce code n'affiche que le code
CaptureCallback
pertinent pour Google LLB. Vous aurez probablement d'autres codes dans ces rappels. - Le passage dans
TotalCaptureResult
permet à Google LLB d'analyser les données d'exposition automatique et d'autres métadonnées nécessaires pour que l'amplification en basse luminosité traite la détection de scène et détermine l'ampleur de l'amplification à appliquer au frame. - Vous devez transmettre l'objet
captureCallback
lors de la création de la session de caméra, par exemple avec setSingleRepeatingRequest().
Démarrer l'aperçu de l'appareil photo
Une fois que vous avez créé une session de faible luminosité, vous pouvez démarrer le flux d'aperçu de la caméra. Vous devez effectuer cette opération dans le rappel onSuccess()
que vous transmettez à la session de faible luminosité, comme décrit dans Créer une session. Le code suivant montre comment capturer une vidéo :
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.
}
Points clés concernant ce code
lowLightBoostSession
correspond à la session que vous avez créée dans Créer une session.setSceneDetectorCallback()
définit un objet de rappel implémentant l'interfaceSceneDetectorCallback
. La session appelle la méthodeonSceneBrightnessChanged()
de cet objet lorsque la luminosité de la scène change. Votre implémentation doit ajuster l'UI de la caméra de manière appropriée.- Vous pouvez spécifier un
Executor
pour exécuter le rappel. Si vous ne spécifiez pas deExecutor
, le rappel s'exécute sur le thread principal. Dans ce code, nous supposons quelowLightBoostExecutor
est unExecutor
approprié. lowLightBoostSession.getCameraSurface()
renvoieSurface
avec la vidéo capturée.
Débloquer la session
Lorsque la caméra n'est plus active, mettez fin à la session d'amélioration de la luminosité en appelant LowLightBoostSession.release()
. En particulier, vous devez veiller à libérer la session lorsque votre activité est détruite. Pour ce faire, appelez la méthode dans la méthode onDestroy()
de votre activité :
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;
}
}
Points clés concernant ce code
- Une fois la session libérée, vous ne devez appeler aucune de ses méthodes. Vous devez effacer toutes les variables pointant vers la session, comme le fait ce code.