Puedes habilitar varios clientes para que accedan a una cámara de forma simultánea. Para ello, usa las APIs del sistema de Java y del NDK de Android que se describen en esta página para compartir el acceso a los clientes de la cámara del sistema.
Cliente principal: Es el cliente con la prioridad más alta entre los clientes compartidos. Un cliente principal puede crear solicitudes de captura y modificar los parámetros de captura.
Cliente secundario: Todos los demás clientes compartidos son clientes secundarios. Los clientes secundarios no pueden crear solicitudes de captura ni modificar los parámetros de captura. Los clientes secundarios solo pueden enviar solicitudes para iniciar o detener la transmisión.
Para la transmisión, el servicio de cámara usa los parámetros de solicitud de captura predeterminados para la plantilla de vista previa. Si el cliente principal está transmitiendo, el servicio usa los parámetros de solicitud de captura especificados por el cliente principal.
Cómo configurar una sesión compartida
Para compartir un dispositivo de cámara, proporciona la configuración de la sesión compartida en el archivo llamado shared_session_config.xml ubicado en /system_ext/etc/. En este ejemplo de código, el ID de cámara 0 admite el uso compartido de la cámara con una configuración que incluye dos transmisiones, ImageReader y SurfaceView.
<SharedCameraSessionConfigurations colorSpace="-1">
<!-- colorSpace: ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_UNSPECIFIED -->
<SharedCameraSessionConfiguration cameraId="0">
<!-- First OutputConfiguration: All optional fields are provided -->
<OutputConfiguration>
<!-- surfaceType: SURFACE_TYPE_IMAGE_READER -->
<surfaceType>4</surfaceType>
<width>1920</width>
<height>1080</height>
<!-- physicalCameraId is omitted; defaults to "" -->
<!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
<streamUseCase>0</streamUseCase>
<!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
<timestampBase>0</timestampBase>
<!-- mirrorMode: MIRROR_MODE_AUTO -->
<mirrorMode>0</mirrorMode>
<useReadoutTimestamp>0</useReadoutTimestamp>
<!-- format: HAL_PIXEL_FORMAT_RGBA_8888 -->
<format>1</format>
<!-- usage: AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN -->
<usage>3</usage>
<!-- dataSpace: HAL_DATASPACE_UNKNOWN -->
<dataSpace>0</dataSpace>
</OutputConfiguration>
<!-- Second OutputConfiguration: All optional fields are provided -->
<OutputConfiguration>
<!-- surfaceType: SURFACE_TYPE_SURFACE_VIEW -->
<surfaceType>0</surfaceType>
<width>1920</width>
<height>1080</height>
<!-- physicalCameraId is omitted; defaults to "" -->
<!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
<streamUseCase>0</streamUseCase>
<!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
<timestampBase>0</timestampBase>
<!-- mirrorMode: MIRROR_MODE_AUTO -->
<mirrorMode>0</mirrorMode>
<useReadoutTimestamp>0</useReadoutTimestamp>
<!-- format: HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED -->
<format>34</format>
<!-- usage: AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE|AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY -->
<usage>256|2048</usage>
<!-- dataSpace: HAL_DATASPACE_UNKNOWN -->
<dataSpace>0</dataSpace>
</OutputConfiguration>
</SharedCameraSessionConfiguration>
</SharedCameraSessionConfigurations>
Para consultar la configuración de una sesión compartida, los clientes usan CameraCharacteristics para SHARED_SESSION_CONFIGURATION. Los clientes que acceden a una cámara en modo compartido deben usar la configuración de sesión compartida. Cuando la configuración de sesión que pasa un cliente no coincide con la configuración de sesión compartida, falla una llamada a createCaptureSession.
APIs de Java
CameraManager y CameraDevice proporcionan APIs para abrir cámaras en modo compartido.
APIs de CameraManager
CameraManager proporciona las siguientes APIs:
isCameraDeviceSharingSupported: Los clientes usan esta API para determinar si una cámara admite el modo compartido.openSharedCamera: Si una cámara admite el modo compartido, los clientes usan esta API para abrir la cámara en modo compartido.
APIs de CameraDevice.StateCallback
CameraDevice.StateCallback proporciona las siguientes APIs:
onOpenedInSharedMode: Los clientes reciben esta devolución de llamada cuando se abre la cámara en modo compartido. La devolución de llamada indica si el cliente es el cliente principal o secundario.onClientSharedAccessPriorityChanged: Cuando se abre una sesión compartida, se activa esta devolución de llamada cuando cambia la prioridad de un cliente porque un cliente de mayor prioridad abrió o cerró la misma cámara.
CameraSharedCaptureSession
La clase CameraSharedCaptureSession representa una sesión de captura compartida.
En el modo de cámara compartida, un cliente que crea una sesión debe usar el tipo de sesión SESSION_SHARED.
Cuando el sistema crea una sesión, convierte CameraCaptureSession en CameraSharedCaptureSession.
Los clientes secundarios no pueden usar createCaptureRequest. En cambio, los clientes secundarios usan la API de startStreaming para iniciar la transmisión en las plataformas especificadas y la API de stopStreaming para detenerla.
APIs del NDK de Android
Las apps integradas usan estas APIs del NDK de Android para abrir una cámara en modo compartido:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
Prueba las cámaras compartidas
Consulta estas pruebas específicas para cámaras de varios clientes:
Conjunto de pruebas de proveedores (VTS): Consulta
SharedCameraTestenVtsAidlCameraServiceTargetTestConjunto de pruebas de compatibilidad (CTS): Consulta
android.hardware.multiprocess.camera.cts.SharedCameraTestenCtsCameraTestCases
Restricciones
El modo de cámara compartida no admite las siguientes opciones:
- Solicitudes de captura de ráfagas
- Sesiones de extensión
- Sesiones de alta velocidad
- Sesiones sin conexión
OutputConfigurationcon uso compartido de la superficie- Sesiones de captura que se pueden volver a procesar
- Apps de terceros
Cuando un cliente de mayor prioridad abre una cámara en modo normal, el sistema expulsa a todos los clientes de cámara compartida.