Mejora con poca luz

Android 15 presenta el Intensificador de poca luz, un nuevo modo de exposición automática disponible para la Cámara 2 y la extensión de la cámara en modo nocturno. La mejora con poca luz ajusta automáticamente el brillo de la transmisión de vista previa en condiciones de poca luz. Esto se diferencia de la manera en que la extensión de la cámara del modo nocturno crea imágenes estáticas, ya que este modo combina una ráfaga de fotos para crear una imagen única mejorada. Si bien el modo nocturno funciona muy bien para crear imágenes estáticas, no puede crear una transmisión continua de fotogramas, pero la potenciación baja sí puede hacerlo. Por lo tanto, la mejora en entornos con poca luz habilita nuevas funciones de la cámara, como las siguientes:

  • Proporcionar una vista previa de imagen mejorada, de modo que los usuarios puedan enmarcar mejor sus fotos con poca luz
  • Se están escaneando códigos QR con poca luz.

Si habilitas la amplificación de poca luz, se activará automáticamente cuando haya un nivel de luz tenue y se desactivará cuando haya más luz.

Las apps pueden grabar fuera de la transmisión de la versión preliminar en condiciones de poca luz para guardar un video iluminado.

Puedes usar la mejora con poca luz en Camera2 o a través de extensiones de cámara. En este documento, se explica cómo usar la mejora con poca luz con Camera2. También puedes usar la amplificación de poca luz con la extensión de la cámara Modo nocturno si es compatible con el dispositivo.

Comprueba la disponibilidad

Antes de usar la mejora con poca luz, comprueba que el dispositivo sea compatible con ella. Si está disponible, Intensificador de poca luz es uno de los modos de exposición que se enumeran en camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES. (La función Intensificador de poca luz es su propio parámetro de configuración de exposición automática, ya que otros parámetros de configuración de exposición automática no son compatibles con el brillo de vista previa que realiza el Intensificador de poca luz).

Por lo tanto, para verificar si está disponible, llama a CameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES) y comprueba si los modos que se muestran incluyen 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
}

Habilitar potenciación con poca luz

Para habilitar la mejora con poca luz en una sesión de Camera2, establece CaptureRequest.CONTROL_AE_MODE en ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY. Después de hacerlo, deberás confirmar que se haya activado la función Ahorro con poca luz. Para ello, consulta el campo CaptureResult.CONTROL_AE_MODE. Debes comprobarlo porque la mejora de la poca luz no es compatible con todas las configuraciones de la cámara. Por ejemplo, la grabación de alta velocidad no admite la potenciación con poca luz debido a las consideraciones de FPS. Si la función Intensificador de poca luz no está activada, es posible que debas cambiar la configuración de la cámara y volver a intentarlo.

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
);

Supervisión con poca luz

La función Intensificador de poca luz ilumina la transmisión de vista previa en condiciones de poca luz y no tiene ningún efecto si el entorno ya es lo suficientemente brillante como para permitir una captura normal. Para confirmar si el aumento con poca luz está activo, verifica el campo CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE. Si activaste la potenciación de poca luz y está activo, el campo se establecerá en CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE. Luego, puedes mostrar un ícono de luna o alguna otra indicación de que se está aclarando la vista previa.

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
);