Sử dụng dữ liệu đầu vào tuỳ chỉnh của OEM để thêm các sự kiện đầu vào Ô tô mới cho dữ liệu mới và không theo tiêu chuẩn
các tính năng của Android. Các sự kiện đầu vào không chuẩn không được ánh xạ theo
Android KeyEvent
, được thiết kế để dùng 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ảng điều khiển vô lăng và khi được nhấn, sẽ mở ra một ứng dụng bản đồ
(thông qua một ý định) cùng 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 để trực quan hoá vị trí hiện tại của mình mà không bị phân tâm trong khi
lái xe.
Bài viết này mô tả cách sử dụng lại KeyEvent
hiện có trên Android để
tạo CustomInputEvent
để chỉ sử dụng khi không KeyEvent
Android nào có thể
được dùng để biểu thị đối tượng.
HW_CUSTOM_INPUT
Đầ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). OEM xác định
cách tạo thực thể cho sự kiện này. Quyền truy cập vào HW_CUSTOM_INPUT là
đặt thành [chỉ đọc]{:.external}, với VehiclePropertyAccess:READ
.
Để đảm bảo HAL của xe luôn có thể phát đi thông báo 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 thông số chung
int32
, đặt thành [global]{:.external} (với VehicleArea:GLOBAL
) Ba là
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.
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 dữ liệu đến
HW_CUSTOM_INPUT
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 Java gói nằm trong
car-lib/src/android/car/input cùng với các thẻ
giao diện AIDL.
CarInputService, một dịch vụ chính dành cho ô tô, nhận tin nhắn đến CustomInputEvents rồi gửi chúng đến bất kỳ dịch vụ hệ thống Android nào đã đăng ký.
Để đăng ký và nhận CustomInputEvents được gửi đến, 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 giá trị đầu vào loại.Để huỷ đăng ký, các dịch vụ phải gọi CarInputManager#releaseInputEventCapture.
Sơ đồ dưới đây minh hoạ quy trình làm việc của một sự kiện Nhập 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)
OEM cung cấp dịch vụ hệ thống Android để xử lý thư đến
CustomInputEvents qua CarInputService
.
Chỉ những dịch vụ được đánh dấu bằng Quyền đặc quyền android.permission.INJECT_EVENTS có thể đăng ký và nhận CustomInputEvents từ Car Input API (CarInputManager). Không có ứng dụng hoặc dịch vụ bên thứ ba nào có thể được ký bằng quyền hệ thống Android này (chỉ các dịch vụ của Nhà sản xuất thiết bị gốc). 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 vào Car Input API.
Các dịch vụ hệ thống Android của OEM có thể truy cập vào SystemApi
và các phương thức công khai.
Cách triển khai tệp đối chiếu
Xem cách triển khai tham chiếu trong packages/services/Car/tests/SampleCustomInputService, trong đó sẽ được đưa ra làm ví dụ và hướng dẫn. Ví dụ: để thêm một nút mới trong phần đ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 đồ kèm theo vị trí hiện tại của ô tô.
Trong ví dụ này, OEM đã chọn INPUT_CODE_F1
(CustomInputEvent
đầu tiên
hàm tiện lợi) để biểu thị tính năng mới này (mở ứng dụng bản đồ bằng
vị trí hiện tại của ô tô).
Trong quá trình khởi động, dịch vụ này sẽ 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 bản đồ. Để tìm hiểu cách thực hiện việc này, hãy xem CustomInputEventListener.java.