O Android 15 introduz o Melhoria de pouca luz, um novo modo de exposição automática disponível para a Câmera 2 e a extensão da câmera do modo noturno. O recurso Low Light Boost ajusta automaticamente o brilho do stream da prévia em condições de baixa iluminação. Isso é diferente de como a extensão de câmera do modo noturno cria imagens estáticas, porque esse modo combina uma sequência 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 recurso Low Light Boost pode fazer. Assim, o aprimoramento de pouca luz ativa novos recursos da câmera, como estes:
- Proporciona uma visualização de imagem aprimorada para que os usuários possam enquadrar melhor fotos com pouca luz.
- Lendo QR codes com pouca luz.
Se você ativar o aprimoramento de pouca luz, ele será ativado automaticamente quando houver um nível baixo de luz e será desativado quando houver mais luz.
Os apps podem gravar fora do stream da prévia em condições de pouca luz para salvar um vídeo brilhante.
Você pode usar o recurso de baixa luz no Camera2 ou com as extensões da câmera. Este documento explica como usar o Low Light Boost com a Camera2. Você também pode usar o Low Light Boost com a extensão de câmera do Modo noturno, se ele tiver suporte do dispositivo.
Verificar disponibilidade
Antes de usar o recurso, confira se ele é compatível com o dispositivo. Se disponível, o aumento de luz é um dos modos de exposição listados em
camera2.CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES
. O aprimoramento de pouca luz é 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 realizada pelo recurso.
Portanto, para verificar se o modo de baixa iluminação está disponível, chame
CameraCharacteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_MODES)
e confira 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 o aprimoramento de pouca luz
Para ativar o aprimoramento de pouca luz em uma sessão do Camera2, defina
CaptureRequest.CONTROL_AE_MODE
como
ON_LOW_LIGHT_BOOST_BRIGHTNESS_PRIORITY
. Depois disso, verifique
se o recurso "Melhoria de baixa luz" foi ativado no campo
CaptureResult.CONTROL_AE_MODE
. Verifique porque o aprimoramento de baixa
luz não é compatível com todas as configurações da câmera. Por exemplo, a gravação em alta
velocidade não tem suporte ao aumento de pouca luz, devido a considerações de QPS. Se
o aprimoramento de pouca luz não estiver ativado, talvez seja necessário mudar a configuração da
câmera e tentar de novo.
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 o aumento de pouca luz
O aprimoramento de baixa luz ilumina o stream de visualização em condições de pouca luz e
não tem efeito se o ambiente já está claro o suficiente para a captura
normal. Para confirmar se o recurso Low Light Boost está ativo, confira
o campo CaptureResult.CONTROL_LOW_LIGHT_BOOST_STATE
. Se você tiver ativado
o aumento de pouca luz e ele estiver ativo no momento, o campo vai ser definido como
CameraMetadata.CONTROL_LOW_LIGHT_BOOST_STATE_ACTIVE
.
Em seguida, você pode mostrar um
í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 );