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:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
Paylaşılan kameraları test etme
Çok istemcili kameralara özel bu testlere göz atın:
Tedarikçi test paketi (VTS):
VtsAidlCameraServiceTargetTestbölümündekiSharedCameraTestkonusuna bakın.Uyumluluk test paketi (CTS):
android.hardware.multiprocess.camera.cts.SharedCameraTestbölümündekiCtsCameraTestCaseskonusuna bakı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.