Aumento de pouca luz

O Android 15 apresenta o Realce de pouca luz, um novo modo de exposição automática disponível para Câmera 2 e extensão de câmera do modo noturno. Intensificação de pouca luz ajusta automaticamente o brilho do stream de pré-visualização em ambientes com pouca luz pelas condições Isso é diferente de como a extensão da câmera do Modo noturno cria imagens estáticas, porque o modo noturno combina uma sequência de fotos para criar uma imagem melhorada. Embora o modo noturno funcione muito bem para criar imagens estáticas, ele não pode criar um stream contínuo de frames, mas o recurso Low Light Boost. Assim, O recurso Low Light Boost oferece novos recursos de câmera, como:

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

Se você ativar a "Realização de pouca luz", ela será ativada automaticamente quando houver nível de luz e é desligado quando há mais luz.

Os apps podem gravar fora do stream de pré-visualização em condições de pouca luz para salvar uma vídeo mais claro.

Você pode usar a otimização de pouca luz em Camera2 ou por extensões da câmera. Este documento aborda como usar a otimização de pouca luz com a Camera2. Você também pode usar Aumento de pouca luz com a extensão da câmera Modo noturno, se compatível com o dispositivo.

Conferir a disponibilidade

Antes de usar o recurso Pouca luz, verifique se ele é compatível com o dispositivo. Se for está disponível, o recurso de Aumento de pouca luz é um dos modos de exposição listados camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES (com pouca luz Otimização é a própria 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 brilho da visualização realizado pela otimização de baixa iluminação.)

Portanto, para verificar se a Intensidade 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 (next section)
} else {
  // Proceed without Low Light Boost
}

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 (next section)
} else {
  // Proceed without Low Light Boost
}

Ativar otimização de pouca luz

Para ativar a otimização de pouca luz em uma sessão da Camera2, defina CaptureRequest.CONTROL_AE_MODE para ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY Depois de fazer isso, você precisará confirmar se a otimização de pouca luz foi ativada; você pode fazer isso verificando CaptureResult.CONTROL_AE_MODE. Você precisa verificar porque o modo pouca luz A otimização não é compatível com todas as configurações de câmera. Por exemplo, alta velocidade a gravação não é compatível com o Low Light Boost, por causa das considerações de QPS. Se O recurso "Pouca luz" está desativado. Talvez seja necessário mudar a câmera. e tente 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 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 set successfully
      result.get(CaptureResult.CONTROL_AE_MODE) ==
          CameraMetadata.CONTROL_AE_MODE_ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY;
    }
  },
  mCameraHandler
);

Monitorar aumento de pouca luz

A Intensificação de baixa iluminação ilumina o stream de visualização em condições de pouca luz e não terá efeito se o ambiente já estiver claro o suficiente para capturar. Para confirmar se a "Otimização de pouca luz" está ativada no momento, no campo CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE. Se você transformou O recurso "Pouca luz" está ativado e está ativo, o campo é definido como CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE. Em seguida, você pode mostrar ícone de lua ou alguma 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 is active or inactive
      if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) ==
        CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) {
        // Low Light Boost state is active
        // Show Moon Icon
      } else {
        // Low Light Boost state is inactive or AE mode is not set
        // to Low Light Boost
        // 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 is active or inactive
      if (result.get(CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE) ==
        CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE) {
        // Low Light Boost state is active
        // Show Moon Icon
      } else {
        // Low Light Boost state is inactive or AE mode is not set
        // to Low Light Boost
        // Hide Moon Icon
      }
    }
  },
  mCameraHandler
);