OEM 自定义输入

使用 OEM 自定义输入为新的和非标准的 Android 功能添加新的汽车输入事件。非标准输入事件未通过现有的 Android KeyEvent 映射,KeyEvent 旨在通用且可在任何 Android 界面上运行,但未扩展到实现 OEM 特定的功能。例如,位于方向盘控制装置上的一个按钮,按下该按钮时,会打开一个地图应用(通过 intent),其中包含汽车的当前位置。此功能使驾驶员能够直观地看到他们的当前位置,而不会在驾驶时分心。

本文介绍如何重用现有的 Android KeyEvent 来创建 CustomInputEvent当没有 Android KeyEvent 可用于表示该功能时才使用。

HW_CUSTOM_INPUT

OEM 自定义输入由 HW_CUSTOM_INPUTCustomInputEvent.java 表示。HW_CUSTOM_INPUT 是原生事件,由汽车硬件 (Vehicle HAL) 实例化。OEM 决定如何实例化此事件。对 HW_CUSTOM_INPUT 的访问权限设置为 [只读],VehiclePropertyAccess:READ

为确保 Vehicle HAL 始终可以广播最新的可用值,HW_CUSTOM_INPUT 通知设置为 ON_CHANGEVehiclePropertyChangeMode:ON_CHANGE

HW_CUSTOM_INPUT 值由通用 int32 数组组成,设置为 global。三个通用整数是:

  1. 第一个元素表示要由 OEM 定义的输入代码。您可以将任何语义与输入代码关联。

  2. 第二个元素存储目标显示屏,例如主显示屏或集群。

  3. 第三个元素包含事件重复的次数。例如,指示按钮被按下的次数。

CustomInputEvent 和 Car Input API

InputHalService 是接收来自 Vehicle HAL 的传入 HW_CUSTOM_INPUT 的汽车服务。

InputHalService 将传入的 HW_CUSTOM_INPUT 转换为 CustomInputEvent,这是一个 Java parcelable 类,位于 car-lib/src/android/car/input 中,以及相应的 aidl 接口

CarInputService,一个核心汽车输入服务,接收传入的 CustomInputEvents,然后将它们发送到任何已注册的 Android 系统服务。

要注册并接收传入的 CustomInputEvents,系统服务必须:

下图说明了 OEM 自定义输入事件的工作流程。

OEM custom input workflow

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 中的参考实现,该参考实现作为示例和指南提供。例如,在方向盘控制装置中添加一个新按钮。按下此新按钮时,会启动地图应用,其中包含汽车的当前位置。

在此示例中,OEM 选择 INPUT_CODE_F1(第一个 CustomInputEvent 便利函数)来表示此新功能(打开包含汽车当前位置的地图应用)。

在启动期间,此服务通过 requestInputEventCapture 将自身注册到 CarInputManager(请参阅参考实现注册代码)。

当接收到传入的 CustomInputEvents 时,此服务会发送 intent 以启动地图应用。要了解如何完成此操作,请参阅 CustomInputEventListener.java