Anda dapat mengizinkan beberapa klien mengakses kamera secara bersamaan. Untuk melakukannya, gunakan Java dan Android NDK system API yang dijelaskan di halaman ini untuk membagikan akses ke klien kamera sistem.
Klien utama: Klien dengan prioritas tertinggi di antara klien bersama. Klien utama dapat membuat permintaan pengambilan dan mengubah parameter pengambilan.
Klien sekunder: Semua klien bersama lainnya adalah klien sekunder. Klien sekunder tidak dapat membuat permintaan pengambilan atau mengubah parameter pengambilan. Klien sekunder hanya dapat mengirim permintaan untuk memulai atau menghentikan streaming.
Untuk streaming, layanan kamera menggunakan parameter permintaan pengambilan default untuk template pratinjau. Jika klien utama melakukan streaming, layanan akan menggunakan parameter permintaan pengambilan yang ditentukan oleh klien utama.
Mengonfigurasi sesi bersama
Untuk membagikan perangkat kamera, berikan konfigurasi sesi bersama dalam file
bernama shared_session_config.xml yang ada di /system_ext/etc/. Dalam contoh
kode ini, ID kamera 0 mendukung berbagi kamera dengan konfigurasi yang mencakup
dua streaming, ImageReader dan 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>
Untuk membuat kueri konfigurasi sesi bersama, klien menggunakan CameraCharacteristics
untuk SHARED_SESSION_CONFIGURATION. Klien yang mengakses kamera dalam mode bersama
harus menggunakan konfigurasi sesi bersama. Jika konfigurasi sesi yang diteruskan
oleh klien tidak cocok dengan konfigurasi sesi bersama, panggilan
createCaptureSession akan gagal.
Java API
CameraManager dan CameraDevice menyediakan API untuk membuka kamera dalam mode berbagi.
CameraManager API
CameraManager menyediakan API berikut:
isCameraDeviceSharingSupported: Klien menggunakan API ini untuk menentukan apakah kamera mendukung mode berbagi.openSharedCamera: Jika kamera mendukung mode berbagi, klien menggunakan API ini untuk membuka kamera dalam mode berbagi.
CameraDevice.StateCallback API
CameraDevice.StateCallback menyediakan API berikut:
onOpenedInSharedMode: Klien menerima callback ini saat kamera dibuka dalam mode berbagi. Callback menunjukkan apakah klien adalah klien primer atau sekunder.onClientSharedAccessPriorityChanged: Saat sesi bersama dibuka, callback ini dipicu saat prioritas klien diubah karena klien dengan prioritas lebih tinggi membuka atau menutup kamera yang sama.
CameraSharedCaptureSession
Class CameraSharedCaptureSession mewakili sesi pengambilan gambar bersama.
Dalam mode kamera bersama, klien yang membuat sesi harus menggunakan jenis sesi
SESSION_SHARED.
Saat sistem membuat sesi, transmisikan CameraCaptureSession ke
CameraSharedCaptureSession.
Klien sekunder tidak dapat menggunakan createCaptureRequest. Sebagai gantinya, klien sekunder
menggunakan startStreaming API untuk memulai streaming di platform yang ditentukan dan
stopStreaming API untuk menghentikan streaming.
API Android NDK
Aplikasi bawaan menggunakan Android NDK API ini untuk membuka kamera dalam mode bersama:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
Menguji kamera yang dibagikan
Lihat pengujian khusus kamera multi-klien ini:
Vendor test suite (VTS): Lihat
SharedCameraTestdiVtsAidlCameraServiceTargetTestCompatibility Test Suite (CTS): Lihat
android.hardware.multiprocess.camera.cts.SharedCameraTestdiCtsCameraTestCases
Pembatasan
Mode kamera bersama tidak mendukung opsi berikut:
- Permintaan pengambilan gambar burst
- Sesi ekstensi
- Sesi kecepatan tinggi
- Sesi offline
OutputConfigurationdengan berbagi platform- Sesi pengambilan gambar yang dapat diproses ulang
- Aplikasi pihak ketiga
Saat klien berprioritas lebih tinggi membuka kamera dalam mode normal, sistem akan mengeluarkan semua klien kamera bersama.