Use entradas personalizadas OEM para agregar nuevos eventos de entrada de automóviles para funciones de Android nuevas y no estándar. Los eventos de entrada no estándar no están asignados por el KeyEvent
de Android existente, diseñado para ser genérico y para funcionar en cualquier superficie de Android, pero no extendido para implementar funciones específicas de OEM. Por ejemplo, un botón ubicado en el control del volante que, cuando se presiona, abre una aplicación de mapas (a través de una intención) con la ubicación actual del automóvil. Esta función permite a los conductores visualizar su ubicación actual sin distraerse mientras conducen.
Este artículo describe cómo reutilizar un KeyEvent
de Android existente para crear un CustomInputEvent
para usar solo cuando no se puede usar ningún KeyEvent
de Android para representar la característica.
HW_CUSTOM_ENTRADA
Una entrada personalizada OEM está representada por HW_CUSTOM_INPUT y CustomInputEvent.java . HW_CUSTOM_INPUT es el evento nativo, instanciado por el hardware del automóvil (Vehicle HAL). Los OEM determinan cómo instanciar este evento. El acceso a HW_CUSTOM_INPUT se establece como [solo lectura]{:.external}, con VehiclePropertyAccess:READ
.
Para garantizar que Vehicle HAL siempre pueda transmitir el último valor disponible, la notificación HW_CUSTOM_INPUT se establece como ON_CHANGE
, con VehiclePropertyChangeMode:ON_CHANGE
.
Los valores HW_CUSTOM_INPUT se componen de una matriz de int32
genéricos, establecidos como [global]{:.external} (con VehicleArea:GLOBAL
). Los tres enteros genéricos son:
El primer elemento representa el código de entrada que debe definir el OEM. Puede asociar cualquier semántica al código de entrada.
El segundo elemento almacena la pantalla de destino, como la pantalla principal o el grupo.
El tercer elemento contiene el número de veces que se repitió el evento. Por ejemplo, para indicar cuántas veces se ha pulsado un botón.
CustomInputEvent y API de entrada de automóvil
InputHalService es el servicio Car que recibe un HW_CUSTOM_INPUT
entrante del HAL del vehículo.
InputHalService convierte el HW_CUSTOM_INPUT
entrante en CustomInputEvent
, una clase parcelable de Java ubicada en car-lib/src/android/car/input , junto con la interfaz aidl respectiva.
CarInputService , un servicio central de Car Input, recibe CustomInputEvents entrantes y luego los envía a cualquier servicio de sistema Android registrado.
Para registrar y recibir CustomInputEvents entrantes, los servicios del sistema deben:
Implemente CarInputManager.CarInputCaptureCallback#onKeyEvents .
Regístrese a través de CarInputManager#requestInputEventCapture , pasando
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
como parámetro de tipo de entrada.Para cancelar el registro, los servicios deben invocar CarInputManager#releaseInputEventCapture .
El siguiente diagrama ilustra el flujo de trabajo de un evento de entrada personalizada de OEM.
Servicios del sistema Android OEM
Los OEM proporcionan su servicio de sistema Android para manejar CustomInputEvents entrantes de CarInputService
.
Solo los servicios marcados con el permiso de privilegio android.permission.INJECT_EVENTS pueden registrarse y recibir CustomInputEvents desde Car Input API ( CarInputManager ). No se puede firmar ningún servicio o aplicación de terceros con este permiso del sistema Android (solo servicios OEM). Por lo tanto, ningún servicio o aplicación de terceros puede registrarse en la API Car Input.
Los servicios del sistema OEM Android pueden acceder a SystemApi
y métodos públicos.
Implementación de referencia
Consulte la implementación de referencia en packages/services/Car/tests/SampleCustomInputService , que se proporciona como ejemplo y guía. Por ejemplo, para añadir un nuevo botón en el control del volante. Cuando se presiona, este nuevo botón inicia la aplicación de mapas con la ubicación actual del automóvil.
En este ejemplo, el OEM seleccionó INPUT_CODE_F1
(la primera función de conveniencia CustomInputEvent
) para representar esta nueva característica (abrir la aplicación de mapas con la ubicación actual del automóvil).
Durante el inicio, este servicio se registra en CarInputManager
a través de requestInputEventCapture
(consulte el código de registro de implementación de referencia .
Al recibir CustomInputEvents entrantes, este servicio envía la intención de iniciar la aplicación de mapas. Para saber cómo se logra esto, consulte CustomInputEventListener.java .