Utilizza gli input personalizzati OEM per aggiungere nuovi eventi di input Auto per funzionalità Android nuove e non standard. Gli eventi di input non standard non sono mappati dall'attuale Android KeyEvent
, progettato per essere generico e funzionare su qualsiasi piattaforma Android, ma non esteso per implementare funzionalità specifiche per gli OEM. Ad esempio, un pulsante situato sul controllo del volante che, se premuto, apre un'app di mappe (tramite un'intenzione) con la posizione attuale dell'auto. Questa funzionalità consente ai conducenti di visualizzare la propria posizione attuale senza distrarsi mentre guidano.
Questo articolo descrive come riutilizzare un KeyEvent
Android esistente per creare un CustomInputEvent
da utilizzare solo quando non è possibile utilizzare un KeyEvent
Android per rappresentare la funzionalità.
HW_CUSTOM_INPUT
Un input personalizzato OEM è rappresentato da HW_CUSTOM_INPUT e
CustomInputEvent.java. HW_CUSTOM_INPUT è
l'evento nativo, creato dall'hardware dell'auto (Vehicle HAL). Gli OEM determinano come creare un'istanza di questo evento. L'accesso a HW_CUSTOM_INPUT è impostato su [sola lettura] con VehiclePropertyAccess:READ
.
Per garantire che l'HAL del veicolo possa sempre trasmettere l'ultimo valore disponibile, la notifica HW_CUSTOM_INPUT è impostata su ON_CHANGE
con VehiclePropertyChangeMode:ON_CHANGE
.
I valori HW_CUSTOM_INPUT sono composti da un array di int32
generici, impostato come globale. I tre interi generici sono:
Il primo elemento rappresenta il codice di input da definire dall'OEM. Puoi associare qualsiasi semantica al codice di input.
Il secondo elemento memorizza la visualizzazione di destinazione, ad esempio la visualizzazione principale o il cluster.
Il terzo elemento contiene il numero di volte in cui l'evento è stato ripetuto. Ad esempio, per indicare quante volte è stato premuto un pulsante.
API CustomInputEvent e Car Input
InputHalService è il servizio Car che riceve un messaggio HW_CUSTOM_INPUT
in arrivo dall'HAL del veicolo.
InputHalService converte il HW_CUSTOM_INPUT
in arrivo in CustomInputEvent
, una classe Java parcellabile situata in car-lib/src/android/car/input, insieme alla rispettiva interfaccia aidl.
CarInputService, un servizio di input dell'auto di base, riceve gli eventi CustomInputEvent in entrata e li invia a qualsiasi servizio di sistema Android registrato.
Per registrare e ricevere eventi CustomInputEvent in entrata, i servizi di sistema devono:
Implementare CarInputManager.CarInput CaptureCallback#onKeyEvents.
Registrati tramite CarInputManager#requestInputEventCapture, passando
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
come parametro di tipo di input.Per annullare la registrazione, i servizi devono invocare CarInputManager#releaseInputEventCapture.
Il seguente diagramma illustra il flusso di lavoro di un evento di input personalizzato OEM.
Servizi di sistema Android OEM
Gli OEM forniscono il proprio servizio di sistema Android per gestire gli eventi CustomInputEvent in arrivo da CarInputService
.
Solo i servizi contrassegnati con l'autorizzazione di privilegio android.permission.INJECT_EVENTS possono registrare e ricevere eventi CustomInput dall'API Car Input (CarInputManager). Non è possibile firmare applicazioni o servizi di terze parti con questa autorizzazione di sistema Android (solo servizi OEM). Pertanto, nessun servizio o applicazione di terze parti può registrarsi all'API Car Input.
I servizi di sistema Android dell'OEM possono accedere a SystemApi
e ai metodi pubblici.
Implementazione dei riferimenti
Consulta l'implementazione di riferimento in packages/services/Car/tests/SampleCustomInputService, che viene fornita come esempio e linea guida. Ad esempio, per aggiungere un nuovo pulsante al controllo del volante. Se premuto, questo nuovo pulsante avvia l'app Maps con la posizione attuale dell'auto.
In questo esempio, l'OEM ha selezionato INPUT_CODE_F1
(la prima CustomInputEvent
funzione di convenienza) per rappresentare questa nuova funzionalità (apertura dell'app Maps con
la posizione attuale dell'auto).
Durante l'avvio, questo servizio si registra su CarInputManager
tramite requestInputEventCapture
(consulta il
codice di registrazione dell'implementazione di riferimento.
Quando riceve CustomInputEvents in entrata, questo servizio invia l'intent per avviare l'app Maps. Per scoprire come viene eseguita questa operazione, consulta CustomInputEventListener.java.