Use uma sessão de aumento do modo pouca luz para ativar e desativar o recurso.
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'
}
O LowLightBoostSession é fornecido pelo pacote com.google.android.gms.cameralowlight do Google Play Services. Consulte a documentação do Google
Play Services para informações sobre como acessar as APIs do Google Play
Services.
Criar um objeto de callback
Ao criar a sessão de melhoria de pouca luz, você precisará transmitir um objeto que implemente a interface LowLightBoostCallback.
As funções desse objeto são chamadas quando a sessão é desconectada ou
destruída. O código a seguir mostra como criar um callback:
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;
}
Pontos principais sobre esse código
- Esse código define um método particular,
createLowLightBoostCallback(), que cria o objeto de callback. Você vai chamar esse método quando criar a sessão de melhoria de pouca luz, conforme descrito em Criar uma sessão. - O callback é chamado quando a sessão é desconectada ou destruída. Ele não é chamado quando a sessão é criada. Para verificar se a sessão foi
criada com sucesso, examine o objeto
Taskretornado porLowLightBoostClient.createSession.
Criar uma sessão
Para criar uma sessão com pouca luz, chame o método
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");
});
Pontos principais sobre esse código
- Você transmite um objeto
LowLightBoostOptionsparacreateSession()para configurar a sessão. Esse objeto especifica coisas como a superfície de destino, o ID da câmera a ser usada e as dimensões da prévia. - Esse código pressupõe que você já abriu uma conexão com uma câmera Camera2
e usou essas informações para definir os valores de
cameraId, previewWidth, previewHeight. Para mais informações, consulte a documentação do Camera2. enableLowLightBoosté um valor booleano que especifica se a melhoria em pouca luz deve ser ativada ou desativada.createLowLightBoostCallbacké um método que você escreve para criar o objeto de callback. Esse objeto é chamado quando a sessão é desconectada ou destruída.- O método
LowLightBoostClient.createSession()retorna um objetoTask. Você usa esse objeto para configurar listeners de sucesso e falha. Capture o vídeo no listener de sucesso. - É possível especificar um
Executorpara executar os listeners. Se você não especificar umExecutor, os listeners serão executados na linha de execução principal. Neste código, presumimos quelowLightBoostExecutoré umExecutoradequado.
Transmitir os resultados da captura
O Aumento do modo pouca luz do Google precisa de determinados metadados da câmera para saber a quantidade correta de iluminação a ser aplicada. É preciso transmitir o TotalCaptureResult ao método
processCaptureResult(). Você pode receber o TotalCaptureResult no método de callback 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);
}
}
};
Pontos principais sobre esse código
- Esse código mostra apenas o código
CaptureCallbackrelevante para o LLB do Google. Provavelmente você terá outros códigos nesses callbacks. - A transmissão do
TotalCaptureResultpermite que o LLB do Google analise os dados de exposição automática e outros metadados necessários para que o recurso de melhoria em pouca luz processe a detecção de cena e determine o quanto de melhoria aplicar ao frame. - Transmita o objeto
captureCallbackao criar a sessão da câmera, por exemplo, com setSingleRepeatingRequest().
Iniciar a visualização da câmera
Depois de criar uma sessão com pouca luz, inicie o stream de prévia da câmera. Faça isso dentro do callback onSuccess() transmitido para a sessão de pouca luz, conforme descrito em Criar uma sessão. O código a seguir mostra como capturar
vídeo:
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.
}
Pontos principais sobre esse código
lowLightBoostSessioné a sessão que você criou em Criar uma sessão.setSceneDetectorCallback()define um objeto de callback que implementa a interfaceSceneDetectorCallback. A sessão chama o métodoonSceneBrightnessChanged()desse objeto quando o brilho da cena muda. Sua implementação precisa ajustar a interface da câmera de maneira adequada.- É possível especificar um
Executorpara executar o callback. Se você não especificar umExecutor, o callback será executado na linha de execução principal. Neste código, presumimos quelowLightBoostExecutoré umExecutoradequado. - O
lowLightBoostSession.getCameraSurface()retorna oSurfacecom o vídeo capturado.
Liberar a sessão
Quando a câmera não estiver mais ativa, encerre a sessão de melhoria de pouca luz chamando LowLightBoostSession.release(). Em especial, libere a sessão quando a atividade for destruída. Para fazer isso, chame
o método no método onDestroy() da sua atividade:
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;
}
}
Pontos principais sobre esse código
- Depois que a sessão for liberada, não chame nenhum dos métodos dela. Você precisa limpar todas as variáveis que apontam para a sessão, como faz este código.