Włączanie kamer obsługujących wielu klientów

Możesz zezwolić wielu klientom na jednoczesny dostęp do kamery. Aby to zrobić, użyj interfejsów API systemu Java i Android NDK opisanych na tej stronie, aby udostępnić klientom aparatu systemowego dostęp do niego.

  • Klient główny: klient o najwyższym priorytecie spośród klientów współdzielonych. Klient główny może tworzyć prośby o przechwytywanie i modyfikować parametry przechwytywania.

  • Dodatkowy klient: wszyscy pozostali klienci współdzieleni są klientami dodatkowymi. Klienci dodatkowi nie mogą tworzyć próśb o przechwytywanie ani modyfikować parametrów przechwytywania. Klienci dodatkowi mogą wysyłać tylko żądania rozpoczęcia lub zatrzymania strumieniowania.

    W przypadku przesyłania strumieniowego usługa aparatu używa domyślnych parametrów żądania przechwytywania w szablonie podglądu. Jeśli klient główny przesyła strumieniowo, usługa używa parametrów żądania przechwytywania określonych przez klienta głównego.

Konfigurowanie sesji współdzielonej

Aby udostępnić urządzenie z kamerą, podaj konfigurację sesji udostępnianej w pliku o nazwie shared_session_config.xml znajdującym się w folderze /system_ext/etc/. W tym przykładzie kodu identyfikator kamery 0 obsługuje udostępnianie kamery z konfiguracją obejmującą 2 strumienie: ImageReaderSurfaceView.

<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>

Aby wysłać zapytanie o konfigurację sesji udostępnianej, klienci używają CameraCharacteristics w przypadku SHARED_SESSION_CONFIGURATION. Klienci, którzy uzyskują dostęp do kamery w trybie udostępnionym, muszą używać konfiguracji sesji udostępnionej. Gdy konfiguracja sesji przekazana przez klienta nie pasuje do konfiguracji sesji udostępnionej, połączenie createCaptureSession kończy się niepowodzeniem.

Interfejsy API Java

CameraManagerCameraDevice udostępniają interfejsy API do otwierania kamer w trybie udostępniania.

Interfejsy CameraManager API

CameraManager udostępnia te interfejsy API:

  • isCameraDeviceSharingSupported: klienci używają tego interfejsu API, aby sprawdzić, czy aparat obsługuje tryb udostępniania.

  • openSharedCamera: jeśli kamera obsługuje tryb udostępniania, klienci używają tego interfejsu API, aby otworzyć kamerę w tym trybie.

Interfejsy API CameraDevice.StateCallback

CameraDevice.StateCallback udostępnia te interfejsy API:

  • onOpenedInSharedMode: klienci otrzymują to wywołanie zwrotne, gdy kamera jest otwarta w trybie udostępniania. Funkcja zwrotna wskazuje, czy klient jest klientem głównym czy dodatkowym.

  • onClientSharedAccessPriorityChanged: gdy otwarta jest sesja udostępniona, to wywołanie zwrotne jest wywoływane, gdy priorytet klienta zostanie zmieniony, ponieważ klient o wyższym priorytecie otworzył lub zamknął ten sam aparat.

CameraSharedCaptureSession

Klasa CameraSharedCaptureSession reprezentuje udostępnioną sesję zapisu. W trybie udostępnianej kamery klient, który tworzy sesję, musi używać typu sesji SESSION_SHARED.

Gdy system utworzy sesję, przekształć CameraCaptureSessionCameraSharedCaptureSession.

Klienci dodatkowi nie mogą używać createCaptureRequest. Zamiast tego klienci dodatkowi używają interfejsu startStreaming API, aby rozpocząć przesyłanie strumieniowe na określonych platformach, oraz interfejsu stopStreaming API, aby je zatrzymać.

Interfejsy Android NDK API

Wbudowane aplikacje używają tych interfejsów API Android NDK do otwierania aparatu w trybie udostępniania:

Testowanie udostępnionych kamer

Zapoznaj się z tymi testami dotyczącymi kamer obsługujących wielu klientów:

Ograniczenia

Tryb udostępnianej kamery nie obsługuje tych opcji:

  • Żądania przechwytywania seryjnego
  • Sesje rozszerzeń
  • Sesje o dużej szybkości
  • Sesje offline
  • OutputConfiguration z udostępnianiem platformy
  • Sesje przechwytywania, które można przetworzyć ponownie
  • Aplikacje innych firm

Gdy klient o wyższym priorytecie otworzy kamerę w trybie normalnym, system usunie wszystkich klientów korzystających z niej w trybie udostępniania.