API de Camera2 Extensions

Nota: Esta página hace referencia al paquete Camera2. A menos que tu app requiera funciones específicas de bajo nivel de Camera2, te recomendamos que uses CameraX. CameraX y Camera2 admiten Android 5.0 (nivel de API 21) y versiones posteriores.

Camera2 proporciona una API de Extensions para acceder a las extensiones que los fabricantes de dispositivos implementaron en varios dispositivos Android. Para obtener una lista de los modos de extensión compatibles, consulta Extensiones de cámara.

Para obtener una lista de los dispositivos que admiten extensiones, consulta la sección Dispositivos compatibles.

Arquitectura de extensiones

En la siguiente imagen, se muestra la arquitectura de las extensiones de cámara.

Figura 1: Arquitectura de las extensiones de cámara

Una aplicación de Camera2 puede usar extensiones a través de la API de Camera2. La API de Camera2 proporciona formas de consultar las extensiones disponibles, configurar una sesión de cámara de extensión y comunicarse con la biblioteca de OEM de extensiones de cámara. Esto permite que la aplicación use extensiones como Noche, HDR, Automático, Bokeh o Retoque facial.

Prueba un dispositivo de cámara para verificar la compatibilidad con la API de Camera2 Extensions

En el siguiente fragmento de código, se verifica si el dispositivo admite la API de Camera2 Extensions. No todos los dispositivos admiten extensiones, o bien es posible que el dispositivo admita un subconjunto de extensiones. El fragmento devuelve una lista de IDs de cámaras compatibles que admiten extensiones de cámara.

private fun getExtensionCameraIds(cameraManager: CameraManager): List<String> =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        cameraManager.cameraIdList.filter { cameraId ->
            val characteristics = cameraManager.getCameraCharacteristics(cameraId)
            val extensionCharacteristics =
                cameraManager.getCameraExtensionCharacteristics(cameraId)
            val capabilities =
                characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES)
            extensionCharacteristics.supportedExtensions.isNotEmpty() &&
                capabilities?.contains(
                    CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE
                ) ?: false
        }
    } else emptyList()

Crea una CameraExtensionSession con la API de Camera2 Extensions

La API de Camera2 Extensions, cuando se usa con dispositivos compatibles, te permite acceder a ciertas extensiones de la cámara. En el siguiente fragmento de código, se muestra un ejemplo de cómo crear un CameraExtensionSession para usar el modo de captura nocturna en una aplicación de Camera2 existente.

private val captureCallbacks = object : CameraExtensionSession.ExtensionCaptureCallback() {
    // Implement Capture Callbacks.
}
private val extensionSessionStateCallback = object : CameraExtensionSession.StateCallback() {
    override fun onConfigured(session: CameraExtensionSession) {
        cameraExtensionSession = session
        try {
            val captureRequest =
                cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply {
                    addTarget(previewSurface)
                }.build()
            session.setRepeatingRequest(
                captureRequest,
                Dispatchers.IO.asExecutor(),
                captureCallbacks
            )
        } catch (e: CameraAccessException) {
            Snackbar.make(
                previewView,
                "Failed to preview capture request",
                Snackbar.LENGTH_SHORT
            ).show()
            requireActivity().finish()
        }
    }

    override fun onClosed(session: CameraExtensionSession) {
        super.onClosed(session)
        cameraDevice.close()
    }

    override fun onConfigureFailed(session: CameraExtensionSession) {
        Snackbar.make(
            previewView,
            "Failed to start camera extension preview",
            Snackbar.LENGTH_SHORT
        ).show()
        requireActivity().finish()
    }
}

private fun startExtensionSession() {
    val outputConfig = arrayListOf(
        OutputConfiguration(stillImageReader.surface),
        OutputConfiguration(previewSurface)
    )
    val extensionConfiguration = ExtensionSessionConfiguration(
        CameraExtensionCharacteristics.EXTENSION_NIGHT,
        outputConfig,
        Dispatchers.IO.asExecutor(),
        extensionSessionStateCallback
    )
    cameraDevice.createExtensionSession(extensionConfiguration)
}

Recursos adicionales

Para obtener más información, consulta CameraExtensionCharacteristics y los ejemplos públicos de la API de Camera2 Extensions.