使用 OEM 自訂輸入內容,為新版和非標準 Android 功能新增車輛輸入事件。現有的 Android KeyEvent
不會對應非標準的輸入事件,因為這項 Android KeyEvent
的設計是為了適用於任何 Android 介面,但不會擴充以實作 OEM 特有的功能。舉例來說,方向盤控制項上的按鈕,按下後會透過意圖開啟地圖應用程式,並顯示車輛目前位置。這項功能可讓駕駛人查看目前位置,且不會在開車時分心。
本文說明如何重複使用現有的 Android KeyEvent
,建立 CustomInputEvent
,僅在無法使用 Android KeyEvent
代表功能時使用。
HW_CUSTOM_INPUT
OEM 自訂輸入內容以 HW_CUSTOM_INPUT 和 CustomInputEvent.java 表示。HW_CUSTOM_INPUT 是由車輛硬體 (車輛 HAL) 例項化的原生事件。OEM 會決定如何例項化這個事件。HW_CUSTOM_INPUT 的存取權設為 [read only],並顯示 VehiclePropertyAccess:READ
。
為確保車輛 HAL 一律能播送最新可用值,HW_CUSTOM_INPUT 通知會設為 ON_CHANGE
,並搭配 VehiclePropertyChangeMode:ON_CHANGE
。
HW_CUSTOM_INPUT 值是由一般 int32
陣列組成,設定為 GLOBAL
(含 VehicleArea:GLOBAL
)。三個一般整數為:
第一個元素代表要由原始設備製造商定義的輸入代碼。 您可以將任何語意與輸入程式碼建立關聯。
第二個元素會儲存目標螢幕,例如主螢幕或儀表板。
第三個元素包含事件的重複次數。 例如,指出按鈕的按壓次數。
CustomInputEvent 和 Car Input API
InputHalService 是接收車輛 HAL 傳入 HW_CUSTOM_INPUT
的車輛服務。
InputHalService 會將傳入的 HW_CUSTOM_INPUT
轉換為 CustomInputEvent
,這是位於 car-lib/src/android/car/input 的 Java parcelable 類別,以及相應的 aidl 介面。
CarInputService 是核心車輛輸入服務,可接收傳入的 CustomInputEvent,然後將其傳送至任何已註冊的 Android 系統服務。
如要註冊及接收傳入的 CustomInputEvents,系統服務必須:
透過 CarInputManager#requestInputEventCapture 註冊,並將
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
做為輸入類型參數傳遞。如要取消註冊,服務必須叫用 CarInputManager#releaseInputEventCapture。
下圖說明 OEM 自訂輸入事件的工作流程。
原始設備製造商 (OEM) Android 系統服務
原始設備製造商 (OEM) 會提供 Android 系統服務,處理來自 CarInputService
的 CustomInputEvent。
只有標有 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
便利函式) 代表這項新功能 (開啟地圖應用程式並顯示目前車輛位置)。
啟動時,這項服務會向 CarInputManager
註冊 requestInputEventCapture
(請參閱參考實作註冊程式碼)。
收到傳入的 CustomInputEvent 時,這項服務會傳送意圖來啟動地圖應用程式。如要瞭解如何完成這項操作,請參閱 CustomInputEventListener.java。