Включить многопользовательские камеры

Вы можете разрешить нескольким клиентам одновременный доступ к камере. Для этого используйте системные API Java и Android NDK, описанные на этой странице, для совместного доступа к камерам клиентов системы.

  • Основной клиент: клиент с наивысшим приоритетом среди общих клиентов. Основной клиент может создавать запросы на захват и изменять параметры захвата.

  • Вторичный клиент: Все остальные общие клиенты являются вторичными клиентами. Вторичные клиенты не могут создавать запросы на захват и изменять параметры захвата. Вторичные клиенты могут только отправлять запросы на запуск или остановку потоковой передачи.

    Для потоковой передачи сервис камеры использует параметры запроса захвата по умолчанию для шаблона предварительного просмотра. Если основной клиент осуществляет потоковую передачу, сервис использует параметры запроса захвата, указанные основным клиентом.

Настроить общий сеанс

Чтобы предоставить общий доступ к камере, укажите конфигурацию общего сеанса в файле shared_session_config.xml , расположенном в папке /system_ext/etc/ . В этом примере кода камера с идентификатором 0 поддерживает общий доступ к камере с конфигурацией, включающей два потока: ImageReader и 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>

Для запроса конфигурации общего сеанса клиенты используют CameraCharacteristics для SHARED_SESSION_CONFIGURATION . Клиенты, получающие доступ к камере в режиме общего доступа, должны использовать конфигурацию общего сеанса. Если конфигурация сеанса, переданная клиентом, не соответствует конфигурации общего сеанса, вызов createCaptureSession завершается ошибкой.

API Java

CameraManager и CameraDevice предоставляют API для открытия камер в режиме общего доступа.

API CameraManager

CameraManager предоставляет следующие API:

  • isCameraDeviceSharingSupported : клиенты используют этот API, чтобы определить, поддерживает ли камера режим общего доступа.

  • openSharedCamera : если камера поддерживает режим общего доступа, клиенты используют этот API для открытия камеры в режиме общего доступа.

API CameraDevice.StateCallback

CameraDevice.StateCallback предоставляет следующие API:

  • onOpenedInSharedMode : Клиенты получают этот обратный вызов при открытии камеры в режиме общего доступа. Обратный вызов указывает, является ли клиент основным или дополнительным.

  • onClientSharedAccessPriorityChanged : при открытии общего сеанса этот обратный вызов запускается, когда приоритет клиента изменяется, поскольку клиент с более высоким приоритетом открыл или закрыл ту же камеру.

CameraSharedCaptureSession

Класс CameraSharedCaptureSession представляет собой общий сеанс захвата. В режиме общей камеры клиент, создающий сеанс, должен использовать тип сеанса SESSION_SHARED .

Когда система создает сеанс, приведите CameraCaptureSession к CameraSharedCaptureSession .

Вторичные клиенты не могут использовать createCaptureRequest . Вместо этого вторичные клиенты используют API startStreaming для запуска потоковой передачи на указанных поверхностях и API stopStreaming для ее остановки.

API Android NDK

Встроенные приложения используют следующие API Android NDK для открытия камеры в режиме общего доступа:

Тестирование общих камер

Ознакомьтесь с этими тестами, специфичными для многопользовательских камер:

Ограничения

Режим общей камеры не поддерживает следующие параметры:

  • Запросы на пакетный захват
  • Дополнительные сессии
  • Высокоскоростные сеансы
  • Офлайн-сессии
  • OutputConfiguration с общим доступом к поверхности
  • Повторно обрабатываемые сеансы захвата
  • Сторонние приложения

Когда клиент с более высоким приоритетом открывает камеру в обычном режиме, система исключает все клиенты с общим доступом к камере.