Mengaktifkan kamera multiklien

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:

Menguji kamera yang dibagikan

Lihat pengujian khusus kamera multi-klien ini:

Pembatasan

Mode kamera bersama tidak mendukung opsi berikut:

  • Permintaan pengambilan gambar burst
  • Sesi ekstensi
  • Sesi kecepatan tinggi
  • Sesi offline
  • OutputConfiguration dengan 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.