Bermigrasi ke Camera2

Halaman ini mengidentifikasi perbedaan antara Sistem Tampilan yang Diperluas (EVS) dan Camera2. Bagian ini juga menjelaskan cara menyiapkan implementasi Camera2.

Membuka dan menutup kamera

EVS

openCamera menggabungkan pembukaan perangkat dan konfigurasi satu aliran.

Camera2

Untuk membuka dan menutup perangkat dengan Camera2:

  1. Pilih salah satu mode berikut:

  2. Untuk mengonfigurasi streaming, buat sesi perekaman dengan platform output yang relevan. Misalnya, dari ImageReader atau SurfaceView dengan CameraDevice.createCaptureSession() (Java) atau ACameraDevice_createCaptureSession() (NDK).

    Camera2 mendukung beberapa streaming secara bersamaan. Buat beberapa streaming untuk tujuan seperti pratinjau, perekaman, dan pemrosesan gambar. Aliran berfungsi sebagai pipeline paralel, yang memproses frame mentah secara berurutan dari kamera.

  3. Untuk menutup perangkat kamera, gunakan CameraDevice.close() (Java) atau ACameraDevice_close() (NDK).

Pertimbangkan cuplikan kode contoh berikut:

Java

CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
    manager.openCamera(cameraId, new CameraDevice.StateCallback() {
        @Override
        public void onOpened(@NonNull CameraDevice camera) {
            // Camera opened, now create session
        }
        @Override
        public void onDisconnected(@NonNull CameraDevice camera) {}
        @Override
        public void onError(@NonNull CameraDevice camera, int error) {}
    }, handler);
} catch (CameraAccessException e) {
    // Handle exception
}

NDK

ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
    cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);

Streaming data kamera

Bagian ini menjelaskan cara melakukan streaming data kamera.

EVS

Di EVS, untuk:

  1. Mulai streaming, gunakan startVideoStream.
  2. Hentikan streaming, gunakan stopVideoStream.

Camera2

Di Camera2, untuk:

  1. Buat CaptureRequest yang sesuai untuk pratinjau, gunakan TEMPLATE_PREVIEW dengan CameraDevice.createCaptureRequest() di Java atau ACameraDevice_createCaptureRequest() di NDK.

  2. Kirim permintaan untuk streaming berkelanjutan, gunakan CameraCaptureSession.setSingleRepeatingRequest (Java) atau ACameraCaptureSession_setRepeatingRequestV2 (NDK).

  3. Hentikan streaming, gunakan CameraCaptureSession.stopRepeating (Java) atau ACameraCaptureSession_stopRepeating (NDK).

Pengelolaan buffer

  • Di EVS, setMaxFramesInFlight sebelumnya mengontrol jumlah buffer, yang berpotensi berubah di tengah streaming. Saat streaming kamera dimulai, EVS menyediakan ID buffer untuk setiap frame gambar, yang berkorelasi dengan alamat buffer hardware yang sama dalam memori.

  • Di Camera2, jumlah maksimum gambar untuk AImageReader atau ImageReader ditetapkan dengan AImageReader_new atau ImageReader.newInstance saat sesi diinisialisasi. Nilai ini tidak dapat diubah secara dinamis setelah sesi dimulai. Untuk mendapatkan ID buffer untuk setiap frame, klien dapat mempertahankan peta yang mengorelasikan alamat buffer hardware, yang diperoleh dari objek Image, ke ID unik.

Menjeda dan melanjutkan streaming

  • EVS menggunakan pauseVideoStream dan resumeVideoStream.

  • Camera2 tidak memiliki padanan langsung. Sebagai gantinya, untuk:

Parameter kamera

  • EVS menggunakan metode, seperti setIntParameter untuk mengubah parameter permintaan pengambilan gambar kamera.

  • Di Camera2, untuk mengubah parameter, panggil API set untuk builder CaptureRequest, lalu kirimkan.

Pertimbangkan contoh kode berikut:

Java

CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
// Submit this request

NDK

ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);

Kamera logis

  • EVS: Untuk kamera logis, seperti Surround View, EVS Manager membuka semua kamera fisik terkait, memulai streaming video, dan menyediakan serangkaian gambar yang kohesif.

  • Camera2: Jika fungsi serupa diperlukan dengan Camera2, aplikasi harus mengelola kamera logis, yang mengharuskan Anda untuk:

    • Mengidentifikasi sub-kamera fisik yang terkait dengan kamera logis.
    • Buka setiap kamera fisik yang diperlukan.
    • Mulai streaming di setiap kamera.
    • Sinkronkan frame, jika diperlukan. Idealnya, hal ini ditangani di HAL untuk sinkronisasi tingkat hardware.

Kami akan menyediakan library kompatibilitas (lapisan shim) untuk klien EVS yang ada guna memfasilitasi transisi. Tujuannya adalah untuk mendukung Camera2 API dengan perubahan kode yang minimal.

Izin

EVS

Akses dibatasi untuk ID unik (UID) dengan hak istimewa. Misalnya, AID_AUTOMOTIVE_EVS. Izin yang tidak digunakan lagi mencakup android.car.permission.USE_CAR_EVS_CAMERA.

Camera2

Camera2 memerlukan android.permission.CAMERA. Untuk kasus khusus:

Aplikasi kamera penting untuk keselamatan harus mematuhi kebijakan pemberian izin bawaan Google yang disediakan di Desain untuk Mengemudi.

Klien utama dan sekunder

Untuk akses kamera bersama:

  • EVS menawarkan API eksplisit, setPrimaryClient dan forcePrimaryClient, untuk mengelola klien utama, yang memiliki otoritas untuk mengubah parameter.

  • Camera2, saat kamera dibuka dalam mode bersama (Android 16 dan yang lebih tinggi), prioritas klien yang mengakses kamera menentukan klien utama. Klien dengan prioritas tertinggi (biasanya aplikasi latar depan) dapat mengubah parameter permintaan pengambilan. Tidak ada API langsung yang digunakan untuk memaksakan status utama. Status utama dikelola oleh framework.

Kamera sistem

Untuk membatasi perangkat kamera agar hanya dapat diakses oleh aplikasi sistem atau 1P saja, deklarasikan kemampuan ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA di HAL Kamera untuk perangkat tersebut. Klien harus memiliki android.permission.SYSTEM_CAMERA selain android.permission.CAMERA yang terhubung ke perangkat kamera ini.

CarEVSManager dan CarEVSService

Untuk akses API, aplikasi Java harus menggunakan android.hardware.camera2.CameraManager standar, bukan CarEVSManager.

Untuk kamera tampilan belakang, logika di CarEVSService yang memantau properti VHAL GEAR_SELECTION dan meluncurkan aktivitas harus dimigrasikan ke aplikasi milik OEM. Aplikasi ini:

  • Memantau properti VHAL GEAR_SELECTION.
  • Meluncurkan aktivitas kamera tampilan belakang saat gigi mundur diaktifkan.
  • Menggunakan Camera2 API untuk menampilkan feed kamera.

Untuk tampilan kamera belakang yang konsisten dan tidak terhalang, khususnya selama transisi pengguna atau saat aplikasi lain dapat menghalangi pratinjau, kami merekomendasikan panduan ini saat menerapkan fungsi kamera belakang dengan Camera2:

Rendering tampilan

Layanan tampilan EVS dan layanan tampilan otomotif.

Metode ini tidak digunakan lagi.

Camera2

Gunakan metode rendering Android standar dengan Surface, android.hardware.display.DisplayManager, dan android.view.Display.

Untuk skenario yang memerlukan tampilan kamera awal, ImageReader Camera2 dapat memberikan akses langsung ke buffer hardware sehingga Anda dapat mengintegrasikannya dengan implementasi tampilan berbasis DRM yang ada untuk rendering.

Akses awal kamera ini diizinkan secara eksklusif untuk klien istimewa yang memiliki AID_AUTOMOTIVE_EVS_UID dan terbatas pada kamera sistem yang terletak di bagian luar kendaraan.

HAL Emulator (HAL tiruan EVS)

Kami berencana untuk menghentikan penggunaan EVS Mock HAL. Sebagai gantinya, OEM harus menggunakan HAL kamera yang diemulasikan Camera2, hardware/google/camera/devices/EmulatedCamera/, yang akan ditingkatkan untuk mendukung:

  • Jumlah kamera yang dapat dikonfigurasi.
  • Pola pengujian panel warna.
  • Emulasi file video.

Untuk menyertakan HAL ini dalam build:

# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal

Kebijakan Security-Enhanced Linux (SELinux) yang sesuai juga diperlukan untuk mengizinkan cameraserver berinteraksi dengan layanan Emulated Camera HAL.

HAL Kamera UVC V4L2

Kami berencana menghentikan penggunaan EVS V4L2 HAL. Gunakan dukungan kamera eksternal Camera2 untuk kamera USB (UVC). Untuk mempelajari lebih lanjut, lihat Kamera USB Eksternal.

Akses awal kamera

Akses kamera EVS dibatasi untuk klien istimewa dengan UID AID_AUTOMOTIVE_EVS. Untuk akses kamera sebelum proses booting Android selesai, asalkan UID tetap AID_AUTOMOTIVE_EVS. Namun, akses awal kamera terbatas pada kamera sistem yang terletak di bagian luar kendaraan.

API Ultrasonik

Kami berencana untuk menghentikan penggunaan EVS Ultrasonics API. Sebagai gantinya, gunakan properti VHAL ini yang diperkenalkan di Android 15 untuk deteksi sensor ultrasonik.

Properti Jenis Definisi
ULTRASONICS_SENSOR_POSITION Statis {<x>, <y>, <z>}

Dalam milimeter, setiap nilai merepresentasikan posisi sensor di sepanjang sumbu terkait relatif terhadap frame koordinat sensor AAOS.

ULTRASONICS_SENSOR_ORIENTATION Statis {<qw>, <qx>, <qy>, <qz>}

Yang merupakan rotasi Kuaternion sensor ini relatif terhadap frame koordinat sensor AAOS: $$w+xi+yj+zk$$

ULTRASONICS_SENSOR_FIELD_OF_VIEW Statis {<horizontal>, <vertical>}

Dalam derajat, ruang pandang horizontal dan vertikal sensor.

ULTRASONICS_SENSOR_DETECTION_RANGE Statis {<minimum>, <maximum>}

Dalam milimeter, rentang deteksi sensor.

ULTRASONICS_SENSOR_DETECTION_RANGES Statis {<range_min_1>, <range_max_1>, <range_min_2>, <range_max_2>}

Dalam milimeter, inklusif, array rentang deteksi yang didukung sensor.

ULTRASONICS_SENSOR_DETECTION_RANGES Berkelanjutan {<distance>, <distance_error>}

Dalam milimeter, jarak yang diukur dan kesalahan jarak sensor. Jika hanya rentang yang didukung, ini adalah jarak minimum dalam rentang yang terdeteksi.