Utilisez les entrées personnalisées OEM pour ajouter de nouveaux événements d'entrée de voiture pour les fonctionnalités Android nouvelles et non standard. Les événements d'entrée non standard ne sont pas mappés par le Android KeyEvent
existant, conçu pour être générique et pour fonctionner sur n'importe quelle surface Android, mais non étendu pour implémenter des fonctionnalités spécifiques aux OEM. Par exemple, un bouton situé sur la commande au volant qui, lorsqu'il est enfoncé, ouvre une application de cartes (via une intention) avec l'emplacement actuel de la voiture. Cette fonctionnalité permet aux conducteurs de visualiser leur position actuelle sans se laisser distraire pendant la conduite.
Cet article décrit comment réutiliser un KeyEvent
Android existant pour créer un CustomInputEvent
à utiliser uniquement lorsqu'aucun Android KeyEvent
ne peut être utilisé pour représenter la fonctionnalité.
HW_CUSTOM_INPUT
Une entrée personnalisée OEM est représentée par HW_CUSTOM_INPUT et CustomInputEvent.java . HW_CUSTOM_INPUT est l'événement natif, instancié par le matériel de la voiture (Vehicle HAL). Les OEM déterminent comment instancier cet événement. L'accès à HW_CUSTOM_INPUT est défini sur [lecture seule]{:.external}, avec VehiclePropertyAccess:READ
.
Pour garantir que le Vehicle HAL peut toujours diffuser la dernière valeur disponible, la notification HW_CUSTOM_INPUT est définie sur ON_CHANGE
, avec VehiclePropertyChangeMode:ON_CHANGE
.
Les valeurs HW_CUSTOM_INPUT sont composées d'un tableau de int32
génériques, défini comme [global]{:.external} (avec VehicleArea:GLOBAL
). Les trois entiers génériques sont :
Le premier élément représente le code d'entrée à définir par l'OEM. Vous pouvez associer n'importe quelle sémantique au code d'entrée.
Le deuxième élément stocke l'affichage cible, tel que l'affichage principal ou le cluster.
Le troisième élément contient le nombre de fois où l'événement a été répété. Par exemple, pour indiquer combien de fois un bouton a été enfoncé.
CustomInputEvent et API d'entrée de voiture
InputHalService est le service Car qui reçoit un HW_CUSTOM_INPUT
entrant du véhicule HAL.
InputHalService convertit le HW_CUSTOM_INPUT
entrant en CustomInputEvent
, une classe parcellaire Java située dans car-lib/src/android/car/input , avec l' interface aidl respective.
CarInputService , un service principal de Car Input, reçoit les CustomInputEvents entrants, puis les envoie à n'importe quel service système Android enregistré.
Pour enregistrer et recevoir des CustomInputEvents entrants, les services système doivent :
Implémentez CarInputManager.CarInputCaptureCallback#onKeyEvents .
Inscrivez-vous via CarInputManager#requestInputEventCapture , en passant
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
comme paramètre de type d'entrée.Pour se désinscrire, les services doivent appeler CarInputManager#releaseInputEventCapture .
Le diagramme suivant illustre le flux de travail d'un événement d'entrée personnalisée OEM.
Services système Android OEM
Les OEM fournissent leur service système Android pour gérer les CustomInputEvents entrants de CarInputService
.
Seuls les services marqués avec l'autorisation de privilège android.permission.INJECT_EVENTS peuvent s'inscrire et recevoir des CustomInputEvents à partir de l'API Car Input ( CarInputManager ). Aucun service ou application tiers ne peut être signé avec cette autorisation du système Android (uniquement les services OEM). Par conséquent, aucun service ou application tiers ne peut s’enregistrer auprès de l’API Car Input.
Les services système OEM Android peuvent accéder à SystemApi
et aux méthodes publiques.
Implémentation de référence
Consultez l’implémentation de référence dans packages/services/Car/tests/SampleCustomInputService , qui est fournie à titre d’exemple et de ligne directrice. Par exemple, pour ajouter un nouveau bouton dans la commande au volant. Lorsqu'il est enfoncé, ce nouveau bouton démarre l'application Cartes avec l'emplacement actuel de la voiture.
Dans cet exemple, l'OEM a sélectionné INPUT_CODE_F1
(la première fonction pratique CustomInputEvent
) pour représenter cette nouvelle fonctionnalité (ouverture de l'application Cartes avec l'emplacement actuel de la voiture).
Lors du démarrage, ce service s'enregistre auprès de CarInputManager
via requestInputEventCapture
(voir le code d'enregistrement d'implémentation de référence .
Lors de la réception d'événements CustomInputEvents entrants, ce service envoie l'intention de démarrer l'application Cartes. Pour savoir comment cela est accompli, consultez CustomInputEventListener.java .