Utilisez des entrées personnalisées OEM pour ajouter de nouveaux événements d'entrée de voiture pour les fonctionnalités Android nouvelles et non standards. Les événements d'entrée non standards ne sont pas mappés par le KeyEvent
Android existant, conçu pour être générique et fonctionner sur n'importe quelle surface Android, mais pas é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 cartographie (via un intent) avec la position actuelle de la voiture. Cette fonctionnalité permet aux conducteurs de visualiser leur position actuelle sans être distraits pendant la conduite.
Cet article explique comment réutiliser un KeyEvent
Android existant pour créer un CustomInputEvent
à utiliser uniquement lorsqu'aucun KeyEvent
Android 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], avec VehiclePropertyAccess:READ
.
Pour que le HAL du véhicule puisse 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éfinis comme GLOBAL
(avec VehicleArea:GLOBAL
). Les trois entiers génériques sont les suivants :
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 le nombre de fois où un bouton a été appuyé.
CustomInputEvent et API Car Input
InputHalService est le service de voiture qui reçoit un HW_CUSTOM_INPUT
entrant du HAL du véhicule.
InputHalService convertit le HW_CUSTOM_INPUT
entrant en CustomInputEvent
, une classe parcelable Java située dans car-lib/src/android/car/input, ainsi que l'interface aidl correspondante.
CarInputService, un service d'entrée de voiture de base, reçoit les CustomInputEvents entrants, puis les envoie à tout service système Android enregistré.
Pour s'enregistrer et recevoir des CustomInputEvents entrants, les services système doivent :
Implémentez CarInputManager.CarInputCaptureCallback#onKeyEvents.
Enregistrez-vous via CarInputManager#requestInputEventCapture en transmettant
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
comme paramètre de type d'entrée.Pour annuler l'enregistrement, les services doivent appeler CarInputManager#releaseInputEventCapture.
Le schéma suivant illustre le workflow d'un événement d'entrée personnalisé 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 android.permission.INJECT_EVENTS peuvent s'enregistrer et recevoir des CustomInputEvents de l'API Car Input (CarInputManager). Aucun service ni application tiers ne peuvent être signés avec cette autorisation du système Android (seuls les services OEM). Par conséquent, aucun service ni aucune application tiers ne peuvent s'enregistrer auprès de l'API Car Input.
Les services système Android OEM 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 guide. Par exemple, pour ajouter un bouton dans la commande au volant. Lorsque vous appuyez dessus, l'application Maps démarre avec la position actuelle 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 Maps avec la position actuelle de la voiture).
Au démarrage, ce service s'enregistre auprès de CarInputManager
via requestInputEventCapture
(voir le code d'enregistrement de l'implémentation de référence).
Lorsqu'il reçoit des CustomInputEvents entrants, ce service envoie l'intention de démarrer l'application Maps. Pour savoir comment cela se fait, consultez CustomInputEventListener.java.