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

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

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

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

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

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

Для совместного использования камеры необходимо указать конфигурацию сеанса совместного использования в файле shared_session_config.xml , расположенном в /system_ext/etc/ . В этом примере кода камера с ID 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 с совместным использованием поверхности
  • Повторно обрабатываемые сеансы захвата
  • Сторонние приложения

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