OEM 自定义输入

使用原始设备制造商 (OEM) 自定义输入,可以为新的非标准 Android 功能添加新的汽车输入事件。现有的 Android KeyEvent 不会映射非标准输入事件,前者是通用的,适用于所有 Android surface,但无法扩展用于实现 OEM 专用功能。例如,位于方向盘控件上的按钮,按下此按钮,系统便会打开包含汽车当前位置信息的地图应用(通过 intent)。借助此功能,驾驶员在驾驶过程中可以直观地了解其当前位置,而不会分心。

本文介绍了如何重复使用现有 Android KeyEvent 来创建 CustomInputEvent,以便仅在无法使用任何 Android KeyEvent 代表相应功能时使用。

HW_CUSTOM_INPUT

OEM 自定义输入由 HW_CUSTOM_INPUTCustomInputEvent.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。三个通用整数为:

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

  2. 第二个元素用于存储目标屏幕,例如主屏幕或仪表盘。

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

CustomInputEvent 和 Car Input API

InputHalService 是从车载 HAL 接收传入 HW_CUSTOM_INPUT 的汽车服务。

InputHalService 将传入的 HW_CUSTOM_INPUT 转换为 CustomInputEvent,后者是一种 Java Parcelable 类,与相应 aidl 接口一起位于 car-lib/src/android/car/input

CarInputService 是一项核心汽车输入服务,用于接收传入的 CustomInputEvent,然后将其发送到任何已注册的 Android 系统服务。

如需注册和接收传入的 CustomInputEvent,系统服务必须:

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

OEM 自定义输入的工作流程

OEM Android 系统服务

OEM 提供自己的 Android 系统服务,用于处理从 CarInputService 传入的 CustomInputEvent。

只有那些标有 android.permission.INJECT_EVENTS 特许权限的服务才能通过 Car Input API (CarInputManager) 注册并接收 CustomInputEvent。任何第三方服务或应用均无法通过此 Android 系统权限签名(仅限 OEM 服务)。因此,任何第三方服务或应用均无法向 Car Input API 进行注册。

OEM Android 系统服务可以访问 SystemApi 和公共方法。

参考实现

如需了解相关示例和指南,请参阅 packages/services/Car/tests/SampleCustomInputService 中的参考实现。例如,在方向盘控件中添加新按钮。按下后,此新按钮会启动包含当前汽车位置信息的地图应用。

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

在启动过程中,此服务会通过 requestInputEventCaptureCarInputManager 注册自身(请参阅参考实现注册代码)。

收到传入的 CustomInputEvent 时,此服务会发送 intent 以启动地图应用。如需了解这是如何实现的,请参阅 CustomInputEventListener.java