使用 OEM 自訂輸入為新的非標準 Android 功能新增新的汽車輸入事件。非標準輸入事件不會被現有的 Android KeyEvent
映射,其設計為通用的並且可在任何 Android 表面上工作,但不會擴展以實現 OEM 特定的功能。例如,位於方向盤控制項上的按鈕在按下時會開啟帶有汽車目前位置的地圖應用程式(透過意圖)。此功能使駕駛員能夠直觀地看到他們當前的位置,而不會在駕駛時分心。
本文介紹如何重複使用現有的 Android KeyEvent
來建立CustomInputEvent
以僅在沒有 Android KeyEvent
可用於表示該功能時使用。
HW_CUSTOM_INPUT
OEM 自訂輸入由HW_CUSTOM_INPUT和CustomInputEvent.java表示。 HW_CUSTOM_INPUT是本機事件,由汽車硬體 (Vehicle HAL) 實例化。 OEM 決定如何實例化此事件。對HW_CUSTOM_INPUT 的存取被設定為 [唯讀]{:.external},並使用VehiclePropertyAccess:READ
。
為了確保車輛 HAL 始終能夠廣播最新的可用值, HW_CUSTOM_INPUT通知設定為ON_CHANGE
,其中VehiclePropertyChangeMode:ON_CHANGE
。
HW_CUSTOM_INPUT值由通用int32
陣列組成,設定為 [global]{:.external} (使用VehicleArea:GLOBAL
)這三個通用整數是:
第一個元素表示由 OEM 定義的輸入代碼。您可以將任何語義與輸入代碼相關聯。
第二個元素儲存目標顯示器,例如主顯示器或叢集。
第三個元素包含事件重複的次數。例如,指示按下按鈕的次數。
CustomInputEvent 和汽車輸入 API
InputHalService是從 Vehicle HAL 接收傳入HW_CUSTOM_INPUT
汽車服務。
InputHalService將傳入的HW_CUSTOM_INPUT
轉換為CustomInputEvent
,這是一個位於car-lib/src/android/car/input中的 Java可打包類,以及對應的aidl 介面。
CarInputService是核心汽車輸入服務,接收傳入的 CustomInputEvents,然後將它們傳送到任何已註冊的 Android 系統服務。
要註冊並接收傳入的 CustomInputEvents,系統服務必須:
透過CarInputManager#requestInputEventCapture註冊,傳遞
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
作為輸入類型參數。若要取消註冊,服務必須呼叫CarInputManager#releaseInputEventCapture 。
下圖說明了 OEM 自訂輸入事件的工作流程。
OEM Android系統服務
OEM 提供其 Android 系統服務來處理CarInputService
的傳入 CustomInputEvent。
只有那些標示android.permission.INJECT_EVENTS權限的服務才能註冊並接收來自汽車輸入 API ( CarInputManager ) 的 CustomInputEvents。任何第三方服務或應用程式都不能使用此 Android 系統權限進行簽署(僅限 OEM 服務)。因此,任何第三方服務或應用程式都無法針對汽車輸入 API 進行註冊。
OEM Android 系統服務可以存取SystemApi
和公共方法。
參考實現
請參閱packages/services/Car/tests/SampleCustomInputService中的參考實現,它是作為範例和指南提供。例如,在方向盤控制項中新增一個按鈕。按下時,這個新按鈕會啟動帶有當前汽車位置的地圖應用程式。
在此範例中,OEM 選擇INPUT_CODE_F1
(第一個CustomInputEvent
便利函數)來表示此新功能(開啟具有目前汽車位置的地圖應用程式)。
在啟動過程中,該服務透過requestInputEventCapture
向CarInputManager
註冊自身(請參閱參考實作註冊代碼) 。
當接收傳入的 CustomInputEvents 時,此服務會發送啟動地圖應用程式的意圖。要了解這是如何完成的,請參閱CustomInputEventListener.java 。