Sử dụng phương thức nhập tuỳ chỉnh của OEM để thêm các sự kiện nhập mới cho ô tô cho các tính năng Android mới và không chuẩn. Các sự kiện đầu vào không chuẩn không được ánh xạ bằng KeyEvent
Android hiện có, được thiết kế để chung chung và hoạt động trên mọi nền tảng Android nhưng không được mở rộng để triển khai các tính năng dành riêng cho OEM. Ví dụ: một nút nằm trên bộ điều khiển vô lăng, khi nhấn vào nút này, ứng dụng bản đồ sẽ mở ra (thông qua một ý định) với vị trí hiện tại của ô tô. Tính năng này cho phép người lái xe hình dung vị trí hiện tại của họ mà không bị phân tâm khi lái xe.
Bài viết này mô tả cách sử dụng lại KeyEvent
Android hiện có để tạo CustomInputEvent
chỉ sử dụng khi không thể sử dụng KeyEvent
Android để biểu thị tính năng.
HW_CUSTOM_INPUT
Dữ liệu đầu vào tuỳ chỉnh của OEM được biểu thị bằng HW_CUSTOM_INPUT và CustomInputEvent.java. HW_CUSTOM_INPUT là sự kiện gốc, được phần cứng ô tô tạo thực thể (HAL của xe). Nhà sản xuất thiết bị gốc (OEM) xác định cách tạo bản sao của sự kiện này. Quyền truy cập vào HW_CUSTOM_INPUT được đặt thành [chỉ đọc] với VehiclePropertyAccess:READ
.
Để đảm bảo Vehicle HAL luôn có thể truyền tin giá trị mới nhất hiện có, thông báo HW_CUSTOM_INPUT được đặt thành ON_CHANGE
, với VehiclePropertyChangeMode:ON_CHANGE
.
Các giá trị HW_CUSTOM_INPUT bao gồm một mảng int32
chung, được đặt là toàn cục. Ba số nguyên chung là:
Phần tử đầu tiên đại diện cho mã đầu vào do OEM xác định. Bạn có thể liên kết bất kỳ ngữ nghĩa nào với mã đầu vào.
Phần tử thứ hai lưu trữ màn hình mục tiêu, chẳng hạn như màn hình chính hoặc cụm đồng hồ.
Phần tử thứ ba chứa số lần sự kiện được lặp lại. Ví dụ: để cho biết số lần một nút được nhấn.
CustomInputEvent và Car Input API
InputHalService là dịch vụ Ô tô nhận HW_CUSTOM_INPUT
đến từ HAL (Lớp trừu tượng phần cứng) cho xe.
InputHalService chuyển đổi HW_CUSTOM_INPUT
đến thành CustomInputEvent
, một lớp có thể phân đoạn Java nằm trong car-lib/src/android/car/input, cùng với giao diện aidl tương ứng.
CarInputService, một dịch vụ Car Input (Nhập trên ô tô) cốt lõi, sẽ nhận CustomInputEvents sắp tới rồi gửi các sự kiện đó đến bất kỳ dịch vụ hệ thống Android nào đã đăng ký.
Để đăng ký và nhận CustomInputEvents sắp tới, các dịch vụ hệ thống phải:
Triển khai CarInputManager.CarInputCaptureCallback#onKeyEvents.
Đăng ký thông qua CarInputManager#requestInputEventCapture, truyền
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
làm tham số loại đầu vào.Để huỷ đăng ký, các dịch vụ phải gọi CarInputManager#releaseInputEventCapture.
Sơ đồ sau đây minh hoạ quy trình làm việc của một sự kiện Đầu vào tuỳ chỉnh của OEM.
Dịch vụ hệ thống Android của Nhà sản xuất thiết bị gốc (OEM)
Nhà sản xuất thiết bị gốc (OEM) cung cấp dịch vụ hệ thống Android để xử lý CustomInputEvents đến từ CarInputService
.
Chỉ những dịch vụ được đánh dấu bằng quyền android.permission.INJECT_EVENTS mới có thể đăng ký và nhận CustomInputEvents từ Car Input API (API Nhập cho ô tô) (CarInputManager). Không có dịch vụ hoặc ứng dụng bên thứ ba nào có thể được ký bằng quyền này của hệ thống Android (chỉ dành cho dịch vụ của nhà sản xuất thiết bị gốc (OEM)). Do đó, không dịch vụ hoặc ứng dụng nào của bên thứ ba có thể đăng ký dựa trên Car Input API.
Các dịch vụ hệ thống Android của nhà sản xuất thiết bị gốc (OEM) có thể truy cập vào SystemApi
và các phương thức công khai.
Triển khai tham chiếu
Xem cách triển khai tham chiếu trong packages/services/Car/tests/SampleCustomInputService, được cung cấp làm ví dụ và hướng dẫn. Ví dụ: để thêm một nút mới trong bộ điều khiển vô lăng. Khi được nhấn, nút mới này sẽ khởi động ứng dụng bản đồ với vị trí ô tô hiện tại.
Trong ví dụ này, nhà sản xuất thiết bị gốc đã chọn INPUT_CODE_F1
(hàm tiện lợi CustomInputEvent
đầu tiên) để biểu thị tính năng mới này (mở ứng dụng bản đồ bằng vị trí xe hiện tại).
Trong quá trình khởi động, dịch vụ này tự đăng ký với CarInputManager
thông qua requestInputEventCapture
(xem mã đăng ký triển khai tham chiếu).
Khi nhận được CustomInputEvents đến, dịch vụ này sẽ gửi ý định để khởi động ứng dụng Maps. Để tìm hiểu cách thực hiện việc này, hãy xem CustomInputEventListener.java.