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
. - Dừng phát trực tiếp bằng cách nhấn vào biểu tượ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 dùng:
- 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
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.
Ứng dụng chính và ứng dụng 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
để kết nối với thiết bị camera này.
CarEVSManager và CarEVSService
Để truy cập vào API, các ứng dụng Java nên sử dụng android.hardware.camera2.CameraManager
chuẩn thay vì CarEVSManager
.
Đối với camera quan sát phía sau, logic trong CarEVSService
giám sát thuộc tính GEAR_SELECTION
VHAL và khởi chạy một hoạt động phải được di chuyển sang một ứng dụng thuộc quyền sở hữu của OEM. Ứng dụng này:
- Theo dõi thuộc tính VHAL
GEAR_SELECTION
. - Khởi chạy hoạt động camera quan sát phía sau khi xe chuyển sang số lùi.
- Sử dụng API Camera2 để hiển thị nguồn cấp dữ liệu camera.
Để màn hình hiển thị camera sau luôn nhất quán và không bị che khuất, đặc biệt là trong quá trình chuyển đổi của người dùng hoặc khi các ứng dụng khác có thể che khuất bản xem trước, chúng tôi đề xuất những nguyên tắc này khi triển khai chức năng camera sau bằng Camera2:
Đánh dấu camera quan sát phía sau là camera hệ thống.
Chạy dịch vụ hoặc ứng dụng truy cập vào camera dưới dạng
User 0
bằng quyềnCAMERA_HEADLESS_SYSTEM_USER
.Thêm ứng dụng vào Danh sách cho phép quyền riêng tư của 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ô phỏng camera, hardware/google/camera/devices/EmulatedCamera/
. HAL này sẽ được cải tiến để 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.
Quyền truy cập sớm vào camera
Quyền truy cập vào camera EVS chỉ được cấp cho những ứng dụng khách có đặc quyền với UID AID_AUTOMOTIVE_EVS
. Đối với quyền truy cập vào camera trước khi quá trình khởi động Android hoàn tất, miễn là UID vẫn là AID_AUTOMOTIVE_EVS
. Tuy nhiên, quyền truy cập sớm vào camera chỉ giới hạn ở các camera hệ thống nằm ở bên ngoài xe.
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. |