使用 OEM 自訂輸入內容,為新功能和非標準 Android 功能新增 Car 輸入事件。非標準輸入事件不會由現有的 Android KeyEvent
對應,其設計為通用且可在任何 Android 平台上運作,但不會擴充來實作 OEM 專屬功能。舉例來說,位於方向盤控制項的按鈕,當按下時,會透過意圖開啟地圖應用程式,並顯示車輛目前的位置。這項功能可讓駕駛者在行車時,不必分心就能掌握目前所在位置。
本文說明如何重複使用現有的 Android KeyEvent
建立 CustomInputEvent
,以供在 Android KeyEvent
無法代表功能時使用。
HW_CUSTOM_INPUT
HW_CUSTOM_INPUT 和 CustomInputEvent.java 代表 OEM 自訂輸入內容。HW_CUSTOM_INPUT 是原生事件,由汽車硬體 (車輛 HAL) 執行個體化。原始設備製造商 (OEM) 會決定如何例項化這項事件。使用 VehiclePropertyAccess:READ
將 HW_CUSTOM_INPUT 的存取權設為「唯讀」。
為確保 Vehicle HAL 一律可廣播最新的可用值,HW_CUSTOM_INPUT 通知會設為 ON_CHANGE
,並搭配 VehiclePropertyChangeMode:ON_CHANGE
。
HW_CUSTOM_INPUT 值是由一般 int32
的陣列組成,並將其設為「全域」。三個一般整數如下:
第一個元素代表 OEM 定義的輸入代碼。您可以將任何語意與輸入程式碼建立關聯。
第二個元素會儲存目標顯示器,例如主螢幕或儀表板。
第三個元素包含事件重複次數。例如,用於指出按鈕按下次數。
CustomInputEvent 和 Car Input API
InputHalService 是從 Vehicle HAL 接收傳入 HW_CUSTOM_INPUT
的 Car 服務。
InputHalService 會將傳入的 HW_CUSTOM_INPUT
轉換為 CustomInputEvent
,這是位於 car-lib/src/android/car/input 中的 Java parcelable 類別,以及相應的 aidl 介面。
CarInputService 是核心車輛輸入服務,會接收傳入的 CustomInputEvents,然後將這些資料傳送至任何已註冊的 Android 系統服務。
如要註冊及接收傳入的 CustomInputEvents,系統服務必須:
透過 CarInputManager#requestInputEventCapture 註冊,並將
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
傳遞為輸入類型參數。如要取消註冊,服務必須叫用 CarInputManager#releaseInputEventCapture。
下圖說明 OEM 自訂輸入事件的工作流程。
原始設備製造商 (OEM) Android 系統服務
OEM 會提供 Android 系統服務,用於處理來自 CarInputService
的 CustomInputEvents。
只有標有 android.permission.INJECT_EVENTS 權限的服務才能透過 Car Input API (CarInputManager) 註冊及接收 CustomInputEvents。任何第三方服務或應用程式都無法使用此 Android 系統權限簽署 (僅限 OEM 服務)。因此,沒有任何第三方服務或應用程式可以註冊 Car Input API。
OEM Android 系統服務可存取 SystemApi
和公開方法。
參考實作
請參閱 packages/services/Car/tests/SampleCustomInputService 中的參考實作項目,這項實作項目可做為範例和指南。例如,在方向盤控制項中新增按鈕。按下這個新按鈕後,系統會啟動地圖應用程式,並顯示目前車輛位置。
在這個範例中,原始設備製造商選取 INPUT_CODE_F1
(第一個 CustomInputEvent
便利函式) 來代表這項新功能 (開啟含有目前車輛位置的 Google 地圖應用程式)。
在啟動期間,這項服務會透過 requestInputEventCapture
註冊自己對 CarInputManager
的註冊 (請參閱參考實作註冊程式碼)。
收到傳入的 CustomInputEvents 時,這項服務會傳送意圖以啟動地圖應用程式。如要瞭解完成方式,請參閱 CustomInputEventListener.java。