Use uma sessão de aumento de pouca luz para ativar e desativar o Aumento do modo pouca luz do Google.
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'
}
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 reforço de pouca luz, você precisa 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 aumento de baixa luminosidade, 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, examine o objeto
Task
retornado porLowLightBoostClient.createSession
.
Criar uma sessão
Para criar uma sessão de 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
LowLightBoostOptions
paracreateSession()
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 visualização. - 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 da Camera2. enableLowLightBoost
é um valor booleano que especifica se o modo de pouca luz deve ser ativado ou desativado.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
. Use esse objeto para configurar listeners de sucesso e falha. Capturar o vídeo dentro do listener de sucesso. - É possível especificar um
Executor
para executar os listeners. Se você não especificar umExecutor
, os listeners serão executados na linha de execução principal. Neste código, assumimos quelowLightBoostExecutor
é umExecutor
adequado.
Iniciar a visualização da câmera
Depois de criar uma sessão com pouca luz, você pode iniciar o fluxo de visualização
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ídeos:
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()
do objeto quando o brilho da cena muda. Sua implementação precisa ajustar a interface da câmera de maneira adequada.- É possível especificar um
Executor
para executar o callback. Se você não especificar umExecutor
, o callback será executado na linha de execução principal. Neste código, assumimos quelowLightBoostExecutor
é umExecutor
adequado. lowLightBoostSession.getCameraSurface()
retorna oSurface
com o vídeo capturado.
Liberar a sessão
Quando a câmera não estiver mais ativa, libere a sessão de aumento de pouca luz
chamando LowLightBoostSession.release()
. Em particular, libere
a sessão quando a atividade for destruída. Para fazer isso, chame
o método no método onDestroy()
da 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. É necessário limpar todas as variáveis que apontam para a sessão, como este código faz.