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:
Pilih salah satu mode berikut:
Mode eksklusif, gunakan
CameraManager.openCamera
(Java) atauACameraManager_openCamera
di Native Development Kit (NDK).Mode berbagi, gunakan
openSharedCamera
atauACameraManager_openSharedCamera
. Saat Anda mengaktifkan berbagi kamera, berikan konfigurasi sesi bersama.
Untuk mengonfigurasi streaming, buat sesi perekaman dengan platform output yang relevan. Misalnya, dari ImageReader atau SurfaceView dengan
CameraDevice.createCaptureSession()
(Java) atauACameraDevice_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.
Untuk menutup perangkat kamera, gunakan
CameraDevice.close()
(Java) atauACameraDevice_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:
- Mulai streaming, gunakan
startVideoStream
. - Hentikan streaming, gunakan
stopVideoStream
.
Camera2
Di Camera2, untuk:
Buat
CaptureRequest
yang sesuai untuk pratinjau, gunakanTEMPLATE_PREVIEW
denganCameraDevice.createCaptureRequest()
di Java atauACameraDevice_createCaptureRequest()
di NDK.Kirim permintaan untuk streaming berkelanjutan, gunakan
CameraCaptureSession.setSingleRepeatingRequest
(Java) atauACameraCaptureSession_setRepeatingRequestV2
(NDK).Hentikan streaming, gunakan
CameraCaptureSession.stopRepeating
(Java) atauACameraCaptureSession_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
atauImageReader
ditetapkan denganAImageReader_new
atauImageReader.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 objekImage
, ke ID unik.
Menjeda dan melanjutkan streaming
EVS menggunakan
pauseVideoStream
danresumeVideoStream
.Camera2 tidak memiliki padanan langsung. Sebagai gantinya, untuk:
- Jeda, gunakan
stopRepeating
- Lanjutkan, gunakan
setSingleRepeatingRequest
- Jeda, gunakan
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:
android.permission.SYSTEM_CAMERA
: Untuk mengakses kamera yang disembunyikan dari aplikasi pihak ketiga. Juga memerlukan izinCAMERA
. Untuk mempelajari lebih lanjut, lihat Kamera sistem.android.permission.CAMERA_HEADLESS_SYSTEM_USER
: Memungkinkan akses dariUser 0
, yang penting untuk layanan seperti kamera tampilan belakang yang harus berjalan di seluruh peralihan pengguna. Memerlukan izin KAMERA yang telah diberikan sebelumnya.android.permission.CAMERA_PRIVACY_ALLOWLIST
: Memungkinkan OEM mengecualikan aplikasi penting untuk keselamatan tertentu dari tombol privasi kamera yang dikontrol pengguna.
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
danforcePrimaryClient
, 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:
Tandai kamera tampilan belakang sebagai kamera sistem.
Jalankan layanan atau aplikasi yang mengakses kamera sebagai
User 0
menggunakan izinCAMERA_HEADLESS_SYSTEM_USER
.Tambahkan aplikasi ke Daftar yang Diizinkan untuk Privasi Kamera.
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. |