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, którzy mają dostęp do konta, są klientami dodatkowymi. Klienci dodatkowi nie mogą tworzyć żądań przechwytywania ani modyfikować parametrów przechwytywania. Dodatkowe urządzenia klienckie 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: ImageReader i 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>

Aby wysłać zapytanie o konfigurację sesji udostępnionej, klienci używają CameraCharacteristics w przypadku SHARED_SESSION_CONFIGURATION. Klienci, którzy uzyskują dostęp do kamery w trybie współdzielonym, muszą używać konfiguracji sesji współdzielonej. 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ępnionym.

Interfejsy CameraManager API

CameraManager udostępnia te interfejsy API:

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

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

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. Wywołanie zwrotne 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 kamery udostępnionej 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 kamery udostępnionej nie obsługuje tych opcji:

  • Żądania przechwytywania seryjnego
  • Sesje rozszerzeń
  • Sesje o dużej szybkości
  • Sesje offline
  • OutputConfiguration z udostępnianiem na platformie
  • 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.