Trang này xác định sự khác biệt giữa Hệ thống chế độ xem mở rộng (EVS) và Camera2. Tài liệu này cũng mô tả cách thiết lập quá trình triển khai Camera2.
Mở và đóng camera
EVS
openCamera
kết hợp việc mở thiết bị và định cấu hình một luồng duy nhất.
Camera2
Cách mở và đóng thiết bị bằng Camera2:
Chọn một trong các chế độ sau:
Chế độ độc quyền, sử dụng
CameraManager.openCamera
(Java) hoặcACameraManager_openCamera
trên Native Development Kit (NDK).Chế độ dùng chung, hãy sử dụng
openSharedCamera
hoặcACameraManager_openSharedCamera
. Khi bạn bật tính năng chia sẻ camera, hãy cung cấp cấu hình phiên được chia sẻ.
Để định cấu hình luồng, hãy tạo một phiên chụp với các bề mặt đầu ra có liên quan. Ví dụ: từ ImageReader hoặc SurfaceView có
CameraDevice.createCaptureSession()
(Java) hoặcACameraDevice_createCaptureSession()
(NDK).Camera2 hỗ trợ đồng thời nhiều luồng. Tạo nhiều luồng cho các mục đích như xem trước, ghi hình và xử lý hình ảnh. Các luồng đóng vai trò là các quy trình song song, xử lý tuần tự các khung hình thô từ camera.
Để đóng một thiết bị camera, hãy dùng
CameraDevice.close()
(Java) hoặcACameraDevice_close()
(NDK).
Hãy xem xét các đoạn mã mẫu sau:
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);
Truyền trực tuyến dữ liệu camera
Phần này mô tả cách truyền phát dữ liệu camera.
EVS
Trên EVS, để:
- Bắt đầu phát trực tuyến bằng cách sử dụng
startVideoStream
. - Ngừng truyền trực tuyến, sử dụng
stopVideoStream
.
Camera2
Trên Camera2, hãy làm như sau:
Tạo một
CaptureRequest
phù hợp để xem trước, sử dụngTEMPLATE_PREVIEW
vớiCameraDevice.createCaptureRequest()
trong Java hoặcACameraDevice_createCaptureRequest()
trên NDK.Gửi yêu cầu phát trực tuyến liên tục, hãy sử dụng
CameraCaptureSession.setSingleRepeatingRequest
(Java) hoặcACameraCaptureSession_setRepeatingRequestV2
(NDK).Dừng truyền trực tuyến, sử dụng
CameraCaptureSession.stopRepeating
(Java) hoặcACameraCaptureSession_stopRepeating
(NDK).
Quản lý vùng đệm
Trên EVS,
setMaxFramesInFlight
trước đây đã kiểm soát số lượng vùng đệm, có thể thay đổi giữa luồng. Khi quá trình truyền phát trực tiếp từ camera bắt đầu, EVS sẽ cung cấp một mã nhận dạng bộ đệm cho mỗi khung hình ảnh, mã này tương quan với cùng một địa chỉ bộ đệm phần cứng trong bộ nhớ.Trên Camera2, số lượng hình ảnh tối đa cho
AImageReader
hoặcImageReader
được đặt bằngAImageReader_new
hoặcImageReader.newInstance
khi một phiên được khởi chạy. Bạn không thể thay đổi giá trị này một cách linh hoạt sau khi phiên bắt đầu. Để nhận mã nhận dạng vùng đệm cho mỗi khung hình, các ứng dụng có thể duy trì một bản đồ tương quan địa chỉ vùng đệm phần cứng (lấy từ đối tượngImage
) với một giá trị nhận dạng duy nhất.
Tạm dừng và tiếp tục truyền trực tuyến
EVS sử dụng
pauseVideoStream
vàresumeVideoStream
.Camera2 không có các thành phần tương đương trực tiếp. Thay vào đó, hãy:
- Tạm dừng, sử dụng
stopRepeating
- Tiếp tục, sử dụng
setSingleRepeatingRequest
- Tạm dừng, sử dụng
Thông số camera
EVS đã sử dụng các phương thức, chẳng hạn như
setIntParameter
để thay đổi tham số yêu cầu chụp ảnh của camera.Trên Camera2, để sửa đổi các tham số, hãy gọi API set cho trình tạo
CaptureRequest
rồi gửi tham số đó.
Hãy xem xét các mẫu mã sau:
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);
Camera logic
EVS: Đối với các camera logic, chẳng hạn như camera xem toàn cảnh, EVS Manager sẽ mở tất cả các camera thực liên kết, khởi tạo luồng video và cung cấp một mảng hình ảnh gắn kết.
Camera2: Khi cần có chức năng tương tự với Camera2, các ứng dụng phải quản lý camera logic. Điều này đòi hỏi bạn phải:
- Xác định các camera phụ thực tế liên kết với một camera logic.
- Mở từng camera thực cần thiết.
- Khởi tạo luồng trên mỗi camera.
- Đồng bộ hoá khung hình (nếu cần). Tốt nhất là việc này được xử lý tại HAL để đồng bộ hoá ở cấp phần cứng.
Chúng tôi sẽ cung cấp một thư viện tương thích (lớp shim) cho các ứng dụng EVS hiện có để tạo điều kiện thuận lợi cho quá trình chuyển đổi. Mục tiêu là hỗ trợ API Camera2 với những thay đổi tối thiểu đối với mã.
Quyền
Phần này mô tả những thay đổi đối với các quyền.
EVS
Quyền truy cập bị hạn chế đối với các giá trị nhận dạng riêng biệt (UID) có đặc quyền. Ví dụ: AID_AUTOMOTIVE_EVS
. Các quyền không dùng nữa bao gồm android.car.permission.USE_CAR_EVS_CAMERA
.
Camera2
Camera2 yêu cầu android.permission.CAMERA
. Đối với các trường hợp đặc biệt:
android.permission.SYSTEM_CAMERA
: Để truy cập vào các camera bị ẩn khỏi ứng dụng bên thứ ba. Cũng yêu cầu quyềnCAMERA
. Để tìm hiểu thêm, hãy xem phần Camera hệ thống.android.permission.CAMERA_HEADLESS_SYSTEM_USER
: Cho phép truy cập từUser 0
, rất quan trọng đối với các dịch vụ như camera quan sát phía sau phải chạy trên các công tắc người dùng. Yêu cầu quyền sử dụng CAMERA được cấp trước.android.permission.CAMERA_PRIVACY_ALLOWLIST
: Cho phép các OEM miễn trừ một số ứng dụng quan trọng về an toàn khỏi chế độ cài đặt quyền riêng tư của camera do người dùng kiểm soát.
Các ứng dụng camera quan trọng về sự an toàn phải tuân thủ các chính sách cấp trước quyền truy cập được tích hợp sẵn của Google có trong phần Thiết kế cho hoạt động lái xe.
Máy khách chính và máy khách phụ
Đối với quyền truy cập vào camera được chia sẻ:
EVS cung cấp các API rõ ràng,
setPrimaryClient
vàforcePrimaryClient
, để quản lý ứng dụng chính có quyền sửa đổi các tham số.Camera2, khi máy ảnh được mở ở chế độ dùng chung (Android 16 trở lên), mức độ ưu tiên của ứng dụng truy cập vào máy ảnh sẽ xác định ứng dụng chính. Ứng dụng có mức độ ưu tiên cao nhất (thường là ứng dụng ở nền trước) có thể sửa đổi các tham số yêu cầu chụp. Không có API trực tiếp nào được dùng để buộc trạng thái chính. Trạng thái chính do khung quản lý.
Camera hệ thống
Để hạn chế chỉ hệ thống hoặc các ứng dụng 1P mới có thể truy cập vào thiết bị camera , hãy khai báo chức năng ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
trong Camera HAL cho thiết bị đó. Ngoài android.permission.CAMERA
, các ứng dụng phải có android.permission.SYSTEM_CAMERA
được kết nối với thiết bị camera này.
Camera lùi
EVS
Trước đây, EVS cho phép truy cập vào camera trước khi Android khởi động, đây là một sự kiện quan trọng đối với các tính năng như camera quan sát phía sau. Các nhà sản xuất thiết bị gốc (OEM) của xe chịu trách nhiệm tuân thủ và chứng nhận theo các quy định được cung cấp tại Tiêu chuẩn an toàn xe cơ giới Liên bang (FMVSS), số 111 về tầm nhìn phía sau. Ngoài ra, các OEM (Nhà sản xuất thiết bị gốc) xe phải tuân thủ các quy định khác về camera quan sát phía sau.
Mức độ tuân thủ phụ thuộc vào phần cứng, việc triển khai HAL và khả năng tích hợp hệ thống tổng thể. Sau khi khởi động Android trên nền tảng tham chiếu, EVS thường cần từ 4 đến 6 giây để hoạt động và cấp quyền truy cập vào camera.
Camera2
Một ứng dụng khách có đặc quyền (được xác định bằng AID_AUTOMOTIVE_EVS UID
) có thể sử dụng API Camera2 để truy cập vào camera trước khi quá trình khởi động Android hoàn tất. Quyền truy cập sớm này chỉ giới hạn ở các camera hệ thống ở bên ngoài xe. Camera2 đáp ứng các KPI hiệu suất tương tự cho quyền truy cập sớm vào camera như EVS, thường có sẵn trong vòng từ 4 đến 6 giây sau khi Android khởi động.
Để hiển thị camera sau một cách nhất quán và không bị cản trở, đặc biệt là trong quá trình chuyển đổi người dùng hoặc khi các ứng dụng khác có thể che khuất bản xem trước, bạn nên tuân theo những nguyên tắc này khi triển khai camera sau bằng Camera2:
Chỉ định camera quan sát phía sau là Camera hệ thống để hạn chế quyền truy cập của ứng dụng bên thứ ba.
Chạy dịch vụ hoặc ứng dụng truy cập vào camera dưới dạng
User 0
để sử dụng quyền CAMERA_HEADLESS_SYSTEM_USER. Điều này đảm bảo việc truyền phát trực tiếp từ camera không bị gián đoạn, bất kể người dùng chuyển đổi ứng dụng ở nền trước.Thêm ứng dụng vào Danh sách cho phép quyền riêng tư của camera để cấp quyền truy cập camera ngay cả khi người dùng bật nút quyền riêng tư của camera.
CarEVSManager và CarEVSService
Trước đây, CarEVSManager đã cung cấp cho các ứng dụng Java quyền truy cập vào camera. Quá trình chuyển đổi sang Camera2 sẽ thay thế tính năng này bằng standard android.hardware.camera2.CameraManager
.
Chúng tôi dự định ngừng sử dụng CarEVSService
, một dịch vụ không bắt buộc có chức năng giám sát thuộc tính GEAR_SELECTION VHAL
và được dùng để bắt đầu một hoạt động camera quan sát phía sau do OEM chỉ định. Những OEM sử dụng tính năng này phải chuyển đổi logic liên kết sang một ứng dụng thuộc sở hữu của OEM.
- Theo dõi thuộc tính
GEAR_SELECTION VHAL
. - Khởi chạy hoạt động camera quan sát phía sau khi số lùi được kích hoạt.
- Sử dụng API Camera2 để hiển thị nguồn cấp dữ liệu camera.
Hiển thị kết xuất
Màn hình EVS và dịch vụ màn hình ô tô
Những phương diện này không được dùng nữa.
Camera2
Sử dụng các phương thức kết xuất Android tiêu chuẩn với Surface, android.hardware.display.DisplayManager
và android.view.Display
.
Đối với những trường hợp cần hiển thị camera sớm, ImageReader của Camera2 có thể cung cấp quyền truy cập trực tiếp vào bộ nhớ đệm phần cứng để bạn có thể tích hợp bộ nhớ đệm này với các phương thức triển khai hiển thị dựa trên DRM hiện có để kết xuất.
Quyền truy cập sớm vào camera chỉ được cấp riêng cho những ứng dụng đặc quyền có AID_AUTOMOTIVE_EVS_UID
và chỉ giới hạn ở camera hệ thống nằm ở bên ngoài xe.
HAL trình mô phỏng (HAL mô phỏng EVS)
Chúng tôi dự định ngừng cung cấp EVS Mock HAL. Thay vào đó, các OEM nên sử dụng Camera2 HAL máy ảnh mô phỏng, hardware/google/camera/devices/EmulatedCamera/
. Chúng tôi dự định hỗ trợ:
- Số lượng camera có thể định cấu hình.
- Mẫu kiểm tra thanh màu.
- Mô phỏng tệp video.
Cách đưa HAL này vào bản dựng:
# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal
Bạn cũng phải có các chính sách Security-Enhanced Linux (SELinux) phù hợp để cho phép cameraserver
tương tác với dịch vụ HAL Camera mô phỏng.
HAL camera UVC V4L2
Chúng tôi dự định ngừng sử dụng EVS V4L2 HAL. Sử dụng tính năng hỗ trợ camera bên ngoài Camera2 cho camera USB (UVC). Để tìm hiểu thêm, hãy xem phần Camera USB bên ngoài.
API siêu âm
Chúng tôi dự định ngừng cung cấp các API Siêu âm EVS. Thay vào đó, hãy sử dụng các thuộc tính VHAL này được giới thiệu trong Android 15 để phát hiện bằng cảm biến siêu âm.
Thuộc tính | Loại | Định nghĩa |
---|---|---|
ULTRASONICS_SENSOR_POSITION |
Tĩnh | {<x>, <y>, <z>}
Tính bằng milimet, mỗi giá trị biểu thị vị trí của cảm biến dọc theo trục được liên kết so với khung toạ độ cảm biến AAOS. |
ULTRASONICS_SENSOR_ORIENTATION |
Tĩnh | {<qw>, <qx>, <qy>, <qz>}
Đây là phép xoay Quaternion của cảm biến so với khung toạ độ cảm biến AAOS: $$w+xi+yj+zk$$ |
ULTRASONICS_SENSOR_FIELD_OF_VIEW |
Tĩnh | {<horizontal>, <vertical>}
Trường nhìn ngang và dọc của cảm biến (tính bằng độ). |
ULTRASONICS_SENSOR_DETECTION_RANGE |
Tĩnh | {<minimum>, <maximum>}
Phạm vi phát hiện của cảm biến tính bằng milimet. |
ULTRASONICS_SENSOR_DETECTION_RANGES |
Tĩnh | {<range_min_1>, <range_max_1>, <range_min_2>,
<range_max_2>}
Tính bằng milimet, bao gồm một mảng các dải phát hiện được cảm biến hỗ trợ. |
ULTRASONICS_SENSOR_DETECTION_RANGES |
Liên tục | {<distance>, <distance_error>}
Khoảng cách đo được và sai số khoảng cách của cảm biến (tính bằng milimet). Nếu chỉ hỗ trợ một phạm vi, thì đây là khoảng cách tối thiểu trong phạm vi được phát hiện. |