Ativar câmeras de vários clientes

É possível ativar vários clientes para acessar 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 da câmera do sistema.

  • Cliente principal: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 clientes 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 o streaming, o serviço de câmera usa os parâmetros de solicitação de captura padrão 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 oferece suporte ao 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 createCaptureSession chamada falha.

APIs Java

CameraManager e CameraDevice fornecem APIs para abrir câmeras no modo compartilhado.

APIs CameraManager

CameraManager fornece estas APIs:

  • isCameraDeviceSharingSupported: os clientes usam essa API para determinar se uma câmera oferece suporte ao modo compartilhado.

  • openSharedCamera: se uma câmera oferece suporte ao modo compartilhado, os clientes usam essa API para abrir a câmera no modo compartilhado.

APIs CameraDevice.StateCallback

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 SESSION_SHARED tipo de sessão.

Quando o sistema cria uma sessão, transmita CameraCaptureSession para CameraSharedCaptureSession.

Os clientes secundários não podem usar createCaptureRequest. Em vez disso, os clientes secundários usam a API startStreaming para iniciar o streaming em superfícies especificadas e a API stopStreaming para interromper o streaming.

APIs do Android NDK

Os apps integrados usam essas APIs do Android NDK para abrir uma câmera no modo compartilhado:

Testar câmeras compartilhadas

Consulte estes testes específicos para câmeras de vários clientes:

Restrições

O modo de câmera compartilhada não oferece suporte a estas opções:

  • Solicitações de captura em sequência
  • Sessões de extensão
  • Sessões de alta velocidade
  • Sessões off-line
  • OutputConfiguration com compartilhamento de superfície
  • Sessões de captura reprocessáveis
  • Apps de terceiros

Quando um cliente de maior prioridade abre uma câmera no modo normal, o sistema remove todos os clientes de câmera compartilhada.