É possível permitir que vários clientes acessem uma câmera simultaneamente. Para isso, use as APIs do sistema Java e Android NDK descritas nesta página para compartilhar o acesso aos clientes de câmera do sistema.
Cliente principal:o cliente de maior prioridade entre os clientes compartilhados. Um cliente principal pode criar solicitações de captura e modificar parâmetros de captura.
Cliente secundário:todos os outros clientes compartilhados são secundários. Os clientes secundários não podem criar solicitações de captura nem modificar parâmetros de captura. Os clientes secundários só podem enviar solicitações para iniciar ou interromper o streaming.
Para streaming, o serviço de câmera usa os parâmetros padrão de solicitação de captura para o modelo de visualização. Se o cliente principal estiver transmitindo, o serviço usará os parâmetros de solicitação de captura especificados pelo cliente principal.
Configurar uma sessão compartilhada
Para compartilhar um dispositivo de câmera, forneça a configuração de sessão compartilhada no arquivo
chamado shared_session_config.xml localizado em /system_ext/etc/. Neste exemplo de código, o ID da câmera 0 é compatível com o compartilhamento de câmera com uma configuração que inclui dois streams, ImageReader e 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 uma configuração de sessão compartilhada, os clientes usam CameraCharacteristics
para SHARED_SESSION_CONFIGURATION. Os clientes que acessam uma câmera no modo compartilhado
precisam usar a configuração de sessão compartilhada. Quando a configuração de sessão transmitida
por um cliente não corresponde à configuração de sessão compartilhada, uma
chamada createCaptureSession falha.
APIs Java
CameraManager e CameraDevice fornecem APIs para abrir câmeras no modo compartilhado.
APIs CameraManager
O CameraManager fornece estas APIs:
isCameraDeviceSharingSupported: os clientes usam essa API para determinar se uma câmera é compatível com o modo compartilhado.openSharedCamera: se uma câmera for compatível com o modo compartilhado, os clientes usarão essa API para abrir a câmera nesse modo.
APIs CameraDevice.StateCallback
O CameraDevice.StateCallback fornece estas APIs:
onOpenedInSharedMode: os clientes recebem esse callback quando a câmera é aberta no modo compartilhado. O callback indica se o cliente é o principal ou secundário.onClientSharedAccessPriorityChanged: quando uma sessão compartilhada é aberta, esse callback é acionado quando a prioridade de um cliente é alterada porque um cliente de maior prioridade abriu ou fechou a mesma câmera.
CameraSharedCaptureSession
A classe CameraSharedCaptureSession representa uma sessão de captura compartilhada.
No modo de câmera compartilhada, um cliente que cria uma sessão precisa usar o tipo de sessão
SESSION_SHARED.
Quando o sistema cria uma sessão, transmita CameraCaptureSession para
CameraSharedCaptureSession.
Os clientes secundários não podem usar o createCaptureRequest. Em vez disso, os clientes secundários
usam a API startStreaming para iniciar o streaming em plataformas especificadas e
a API stopStreaming para interromper o streaming.
APIs do Android NDK
Os apps integrados usam estas APIs do NDK do Android para abrir uma câmera no modo compartilhado:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
Testar câmeras compartilhadas
Confira estes testes específicos para câmeras de vários clientes:
Conjunto de testes do fornecedor (VTS): consulte
SharedCameraTestemVtsAidlCameraServiceTargetTestConjunto de teste de compatibilidade (CTS): consulte
android.hardware.multiprocess.camera.cts.SharedCameraTestemCtsCameraTestCases
Restrições
O modo de câmera compartilhada não é compatível com estas opções:
- Solicitações de captura de burst
- Sessões de extensão
- Sessões de alta velocidade
- Sessões off-line
OutputConfigurationcom compartilhamento de superfície- Sessões de captura que podem ser reprocessadas
- Apps de terceiros
Quando um cliente de prioridade mais alta abre uma câmera no modo normal, o sistema remove todos os clientes de câmera compartilhada.