原始設備製造商 (OEM) 自訂輸入內容

使用 OEM 自訂輸入內容,為新功能和非標準 Android 功能新增 Car 輸入事件。非標準輸入事件不會由現有的 Android KeyEvent 對應,其設計為通用且可在任何 Android 平台上運作,但不會擴充來實作 OEM 專屬功能。舉例來說,位於方向盤控制項的按鈕,當按下時,會透過意圖開啟地圖應用程式,並顯示車輛目前的位置。這項功能可讓駕駛者在行車時,不必分心就能掌握目前所在位置。

本文說明如何重複使用現有的 Android KeyEvent 建立 CustomInputEvent,以供在 Android KeyEvent 無法代表功能時使用。

HW_CUSTOM_INPUT

HW_CUSTOM_INPUTCustomInputEvent.java 代表 OEM 自訂輸入內容。HW_CUSTOM_INPUT 是原生事件,由汽車硬體 (車輛 HAL) 執行個體化。原始設備製造商 (OEM) 會決定如何例項化這項事件。使用 VehiclePropertyAccess:READHW_CUSTOM_INPUT 的存取權設為「唯讀」。

為確保 Vehicle HAL 一律可廣播最新的可用值,HW_CUSTOM_INPUT 通知會設為 ON_CHANGE,並搭配 VehiclePropertyChangeMode:ON_CHANGE

HW_CUSTOM_INPUT 值是由一般 int32 的陣列組成,並將其設為「全域」。三個一般整數如下:

  1. 第一個元素代表 OEM 定義的輸入代碼。您可以將任何語意與輸入程式碼建立關聯。

  2. 第二個元素會儲存目標顯示器,例如主螢幕或儀表板。

  3. 第三個元素包含事件重複次數。例如,用於指出按鈕按下次數。

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,系統服務必須:

下圖說明 OEM 自訂輸入事件的工作流程。

原始設備製造商 (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