Usa entradas personalizadas de OEM para agregar nuevos eventos de entrada de vehículos para funciones de Android nuevas y no estándar. Los eventos de entrada no estándar no se asignan con el KeyEvent de Android existente, que está diseñado para ser genérico y funcionar en cualquier superficie de Android, pero no se extiende para implementar funciones específicas del OEM. Por ejemplo, un botón ubicado en el control del volante que, cuando se presiona, abre una app de mapas (a través de un intent) con la ubicación actual del vehículo. Esta función permite que los conductores visualicen su ubicación actual sin distraerse mientras conducen.
En este artículo, se describe cómo reutilizar un KeyEvent de Android existente para crear un CustomInputEvent para usarlo solo cuando no se pueda usar un KeyEvent de Android para representar la función.
HW_CUSTOM_INPUT
Una entrada personalizada de OEM está representada por HW_CUSTOM_INPUT y
CustomInputEvent.java. HW_CUSTOM_INPUT es el
evento nativo, del que se crea una instancia con el hardware del vehículo (HAL del vehículo). Los OEMs determinan cómo crear una instancia de este evento. El acceso a HW_CUSTOM_INPUT se
establece como [solo lectura], con VehiclePropertyAccess:READ.
Para garantizar que el HAL del vehículo siempre pueda transmitir el valor disponible más reciente, la
HW_CUSTOM_INPUT notificación se establece como ON_CHANGE, con
VehiclePropertyChangeMode:ON_CHANGE.
Los valores de HW_CUSTOM_INPUT se componen de un array de
int32 genérico, establecido como GLOBAL (con VehicleArea:GLOBAL). Los tres
números enteros genéricos son los siguientes:
El primer elemento representa el código de entrada que definirá el OEM. Puedes asociar cualquier semántica al código de entrada.
El segundo elemento almacena la pantalla de destino, como la pantalla principal o el clúster.
El tercer elemento contiene la cantidad de veces que se repitió el evento. Por ejemplo, para indicar cuántas veces se presionó un botón.
CustomInputEvent y la API de Car Input
InputHalService es el servicio para vehículos que recibe un
HW_CUSTOM_INPUT entrante del HAL del vehículo.
InputHalService convierte el HW_CUSTOM_INPUT entrante en
la CustomInputEvent, una clase parcelable de Java ubicada en
car-lib/src/android/car/input, junto con la
interfaz aidl respectiva.
CarInputService, un servicio principal de Car Input, recibe CustomInputEvents entrantes y, luego, los envía a cualquier servicio del sistema Android registrado.
Para registrarse y recibir CustomInputEvents entrantes, los servicios del sistema deben hacer lo siguiente:
Implementar CarInputManager.CarInputCaptureCallback#onKeyEvents.
Registrarse a través de CarInputManager#requestInputEventCapture, pasando
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENTcomo el parámetro de tipo de entrada.Para anular el registro, los servicios deben invocar CarInputManager#releaseInputEventCapture.
En el siguiente diagrama, se ilustra el flujo de trabajo de un evento de entrada personalizada de OEM.
Servicios del sistema Android de OEM
Los OEMs proporcionan su servicio del sistema Android para controlar los CustomInputEvents entrantes de CarInputService.
Solo los servicios marcados con el permiso de privilegio android.permission.INJECT_EVENTS pueden registrarse y recibir CustomInputEvents de la API de Car Input (CarInputManager). Ningún servicio o aplicación de terceros puede firmarse con este permiso del sistema Android (solo servicios de OEM). Por lo tanto, ningún servicio o aplicación de terceros puede registrarse en la API de Car Input.
Los servicios del sistema Android de OEM pueden acceder a SystemApi y a métodos públicos.
Implementación de referencia
Consulta la implementación de referencia en packages/services/Car/tests/SampleCustomInputService, que se proporciona como ejemplo y guía. Por ejemplo, para agregar un botón nuevo en el control del volante. Cuando se presiona, este botón nuevo inicia la app de mapas con la ubicación actual del vehículo.
En este ejemplo, el OEM seleccionó INPUT_CODE_F1 (la primera función de conveniencia de CustomInputEvent) para representar esta nueva función (abrir la app de mapas con la ubicación actual del vehículo).
Durante el inicio, este servicio se registra en CarInputManager
a través de requestInputEventCapture (consulta el
código de registro de la implementación de referencia.
Cuando recibe CustomInputEvents entrantes, este servicio envía el intent para iniciar la app de mapas. Para obtener información sobre cómo se logra esto, consulta CustomInputEventListener.java.