Çoklu istemci kameraları etkinleştirme

Birden fazla istemcinin aynı anda bir kameraya erişmesini sağlayabilirsiniz. Bunun için, sistem kamera istemcilerine erişimi paylaşmak üzere bu sayfada açıklanan Java ve Android NDK sistem API'lerini kullanın.

  • Birincil müşteri: Paylaşılan müşteriler arasında en yüksek önceliğe sahip olan müşteri. Birincil istemci, yakalama istekleri oluşturabilir ve yakalama parametrelerini değiştirebilir.

  • İkincil müşteri: Diğer tüm paylaşılan müşteriler ikincil müşterilerdir. İkincil istemciler, yakalama isteği oluşturamaz veya yakalama parametrelerini değiştiremez. İkincil istemciler yalnızca yayını başlatma veya durdurma isteği gönderebilir.

    Kamera hizmeti, yayın için önizleme şablonunun varsayılan yakalama isteği parametrelerini kullanır. Birincil istemci yayın yapıyorsa hizmet, birincil istemci tarafından belirtilen yakalama isteği parametrelerini kullanır.

Paylaşılan oturum yapılandırma

Kamera cihazı paylaşmak için /system_ext/etc/ konumundaki shared_session_config.xml adlı dosyada paylaşılan oturum yapılandırmasını sağlayın. Bu kod örneğinde, kamera kimliği 0, iki akış (ImageReader ve SurfaceView) içeren bir yapılandırmayla kamera paylaşımını destekliyor.

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

Paylaşılan oturum yapılandırmasını sorgulamak için istemciler CameraCharacteristics için SHARED_SESSION_CONFIGURATION kullanır. Paylaşılan modda bir kameraya erişen istemciler, paylaşılan oturum yapılandırmasını kullanmalıdır. Bir istemci tarafından iletilen oturum yapılandırması, paylaşılan oturum yapılandırmasıyla eşleşmediğinde createCaptureSession çağrısı başarısız olur.

Java API'leri

CameraManager ve CameraDevice, kameraları paylaşılan modda açmak için API'ler sağlar.

CameraManager API'leri

CameraManager aşağıdaki API'leri sağlar:

  • isCameraDeviceSharingSupported: İstemciler, bir kameranın paylaşılan modu destekleyip desteklemediğini belirlemek için bu API'yi kullanır.

  • openSharedCamera: Bir kamera paylaşılan modu destekliyorsa istemciler, kamerayı paylaşılan modda açmak için bu API'yi kullanır.

CameraDevice.StateCallback API'leri

CameraDevice.StateCallback aşağıdaki API'leri sağlar:

  • onOpenedInSharedMode: Müşteriler, kamera paylaşılan modda açıldığında bu geri aramayı alır. Geri çağırma, istemcinin birincil mi yoksa ikincil istemci mi olduğunu gösterir.

  • onClientSharedAccessPriorityChanged: Paylaşılan bir oturum açıldığında, daha yüksek öncelikli bir istemci aynı kamerayı açtığı veya kapattığı için istemcinin önceliği değiştirildiğinde bu geri çağırma tetiklenir.

CameraSharedCaptureSession

CameraSharedCaptureSession sınıfı, paylaşılan bir yakalama oturumunu temsil eder. Paylaşılan kamera modunda, oturum oluşturan bir istemci SESSION_SHARED oturum türünü kullanmalıdır.

Sistem bir oturum oluşturduğunda CameraCaptureSession öğesini CameraSharedCaptureSession olarak yayınlar.

İkincil istemciler createCaptureRequest kullanamaz. Bunun yerine, ikincil istemciler belirtilen yüzeylerde akışı başlatmak için startStreaming API'sini, akışı durdurmak için ise stopStreaming API'sini kullanır.

Android NDK API'leri

Yerleşik uygulamalar, paylaşılan modda kamera açmak için aşağıdaki Android NDK API'lerini kullanır:

Paylaşılan kameraları test etme

Çok istemcili kameralara özel bu testlere göz atın:

Kısıtlamalar

Paylaşılan kamera modu aşağıdaki seçenekleri desteklemez:

  • Patlama yakalama istekleri
  • Uzantı oturumları
  • Yüksek hızlı oturumlar
  • Çevrimdışı oturumlar
  • Yüzey paylaşımı ile OutputConfiguration
  • Yeniden işlenebilir yakalama oturumları
  • Üçüncü taraf uygulamaları

Daha yüksek öncelikli bir istemci normal modda kamera açtığında sistem, tüm paylaşılan kamera istemcilerini çıkarır.