Di chuyển sang Camera2

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:

  1. Chọn một trong các chế độ sau:

  2. Để đị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ặc ACameraDevice_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.

  3. Để đóng một thiết bị camera, hãy dùng CameraDevice.close() (Java) hoặc ACameraDevice_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, để:

  1. Bắt đầu phát trực tuyến bằng cách sử dụng startVideoStream.
  2. 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:

  1. Tạo một CaptureRequest phù hợp để xem trước, sử dụng TEMPLATE_PREVIEW với CameraDevice.createCaptureRequest() trong Java hoặc ACameraDevice_createCaptureRequest() trên NDK.

  2. 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ặc ACameraCaptureSession_setRepeatingRequestV2 (NDK).

  3. Dừng truyền trực tuyến, sử dụng CameraCaptureSession.stopRepeating (Java) hoặc ACameraCaptureSession_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ặc ImageReader được đặt bằng AImageReader_new hoặc ImageReader.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ượng Image) 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 pauseVideoStreamresumeVideoStream.

  • Camera2 không có các thành phần tương đương trực tiếp. Thay vào đó, hãy dùng:

Thông số camera

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ền CAMERA. Để 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, setPrimaryClientforcePrimaryClient, để 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:

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.DisplayManagerandroid.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.