Modo de exposição automática com aumento de pouca luz

O Android 15 apresenta o Modo de exposição automática (AE) com reforço de pouca luz, um novo modo de exposição automática disponível para a Câmera 2 e a extensão de câmera do modo noturno. O modo AE de aumento de pouca luz ajusta automaticamente o brilho do fluxo de visualização em condições de pouca luz. Isso é diferente de como a extensão da câmera no modo noturno cria imagens estáticas, porque o modo noturno combina uma série de fotos para criar uma única imagem aprimorada. Embora o modo noturno funcione muito bem para criar uma imagem estática, ele não pode criar um fluxo contínuo de frames, mas o modo de AE de aumento de pouca luz pode. Assim, o Modo AE de reforço de pouca luz ativa novos recursos da câmera, como estes:

  • Fornecer uma visualização de imagem aprimorada para que os usuários possam enquadrar melhor as fotos com pouca luz.
  • Leitura de QR codes em locais com pouca luz.

Se você ativar o modo AE de reforço de pouca luz, ele será ativado automaticamente quando houver um nível de luz baixo e desativado quando houver mais luz.

Os apps podem gravar o fluxo de visualização em condições de pouca luz para salvar um vídeo mais claro.

É possível usar o modo AE com o Modo pouca luz na Camera2 ou nas extensões da câmera. Este documento aborda como usar o modo AE de reforço de pouca luz com a Camera2. Também é possível usar o modo AE de aumento de luz baixa com a extensão da câmera do Modo noturno se o dispositivo oferecer suporte a ele.

Verificar a disponibilidade

Antes de usar o modo AE de reforço de pouca luz, verifique se ele é compatível com o dispositivo. Se estiver disponível, o Modo AE de reforço de pouca luz é um dos modos de exposição listados em camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES. O Modo pouca luz é uma configuração de exposição automática, já que outras configurações de exposição automática não são compatíveis com o clareamento de visualização realizado pelo Modo AE de Modo pouca luz.

Para verificar se o modo de AE de reforço de pouca luz está disponível, chame CameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES) e verifique se os modos retornados incluem ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY:

Kotlin

val characteristics = cameraManager.getCameraCharacteristics(cameraId)
val autoExposureModes =
    characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES)!!
val lowLightBoostSupported = autoExposureModes.contains(
        CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY)

if (lowLightBoostSupported) {
  // Enable Low Light Boost AE Mode (next section)
} else {
  // Proceed without Low Light Boost AE Mode
}

Java

CameraCharacteristics characteristics =
    mCameraManager.getCameraCharacteristics(cameraId);
int[] autoExposureModes =
    characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES);
boolean lowLightBoostSupported = autoExposureModes.contains(
        CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY);

if (lowLightBoostSupported) {
  // Enable Low Light Boost AE Mode (next section)
} else {
  // Proceed without Low Light Boost AE Mode
}

Ativar o modo de otimização de pouca luz

Para ativar o modo AE do Modo pouca luz refinado em uma sessão do Camera2, defina CaptureRequest.CONTROL_AE_MODE como ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY. Depois disso, você vai precisar confirmar se o modo de AE de reforço de pouca luz foi ativado. Para isso, marque o campo CaptureResult.CONTROL_AE_MODE. É necessário verificar porque o aumento do modo pouca luz não é compatível com todas as configurações de câmera. Por exemplo, a gravação de alta velocidade não oferece suporte ao modo AE de aumento de pouca luz devido a considerações de QPS. Se o modo de AE de reforço de pouca luz não estiver ativado, talvez seja necessário mudar a configuração da câmera e tentar novamente.

Kotlin

val captureRequestBuilder = camera.createCaptureRequest(
  CameraDevice.TEMPLATE_PREVIEW)
if (isLowLightBoostAvailable(cameraId)) {
  captureRequestBuilder.set(
    CaptureRequest.CONTROL_AE_MODE,
    CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY
  )
}
// other capture request params

session.setRepeatingRequest(
  captureRequestBuilder.build(),
  object : CaptureCallback() {
    @Override
    fun onCaptureCompleted(session: CameraCaptureSession,
        request: CaptureRequest, result: TotalCaptureResult) {
      // verify Low Light Boost AE Mode AE mode set successfully
      result.get(CaptureResult.CONTROL_AE_MODE) ==
          CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY
    }
  },
  cameraHandler
)

Java

CaptureRequest.Builder captureRequestBuilder =
  mCamera.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
if (isLowLightBoostAvailable(cameraId)) {
  captureRequestBuilder.set(
    CaptureRequest.CONTROL_AE_MODE,
    CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY);
}
// other capture request params

mSession.setRepeatingRequest(
  captureRequestBuilder.build(),
  new CaptureCallback() {
    @Override
    public void onCaptureCompleted(CameraCaptureSession session,
        CaptureRequest request, TotalCaptureResult result) {
      // verify Low Light Boost AE Mode AE mode set successfully
      result.get(CaptureResult.CONTROL_AE_MODE) ==
          CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY;
    }
  },
  mCameraHandler
);

Monitorar o modo AE de aumento de pouca luz

O modo de AE com reforço de pouca luz ilumina o fluxo de visualização em condições de pouca luz e não tem efeito se o ambiente já estiver claro o suficiente para a captura normal. Para confirmar se o modo de AE de reforço de baixa luminosidade está ativo, marque o campo CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE. Se você ativou o modo AE de reforço de pouca luz e ele estiver ativo, o campo será definido como CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE. Você pode mostrar um ícone de lua ou outra indicação de que a visualização está sendo iluminada.

Kotlin

session.setRepeatingRequest(
  captureRequestBuilder.build(),
  object : CaptureCallback() {
    @Override
    fun onCaptureCompleted(session: CameraCaptureSession,
        request: CaptureRequest, result: TotalCaptureResult) {
      // check if Low Light Boost AE Mode is active or inactive
      if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) ==
        CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) {
        // Low Light Boost AE Mode state is active
        // Show Moon Icon
      } else {
        // Low Light Boost AE Mode state is inactive or AE mode is not set
        // to Low Light Boost AE Mode
        // Hide Moon Icon
      }
    }
  },
  cameraHandler
)

Java

mSession.setRepeatingRequest(
  captureRequestBuilder.build(),
  new CaptureCallback() {
    @Override
    public void onCaptureCompleted(CameraCaptureSession session,
        CaptureRequest request, TotalCaptureResult result) {
      // check if Low Light Boost AE Mode is active or inactive
      if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) ==
        CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) {
        // Low Light Boost AE Mode state is active
        // Show Moon Icon
      } else {
        // Low Light Boost AE Mode state is inactive or AE mode is not set
        // to Low Light Boost AE Mode
        // Hide Moon Icon
      }
    }
  },
  mCameraHandler
);