Usar uma sessão de aumento de pouca luz

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 por LowLightBoostClient.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 para createSession() 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 objeto Task. 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 um Executor, os listeners serão executados na linha de execução principal. Neste código, assumimos que lowLightBoostExecutor é um Executor 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

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.