Utilisez des entrées personnalisées OEM pour ajouter de nouveaux événements d'entrée pour voiture pour les nouvelles fonctionnalités Android non standards. Les événements d'entrée non standards ne sont pas mappés par le KeyEvent
Android existant. Ils sont conçus pour être génériques et fonctionner sur n'importe quelle surface Android, mais ils ne sont pas étendus pour implémenter des fonctionnalités spécifiques aux OEM. Par exemple, un bouton situé sur le volant qui, lorsqu'il est enfoncé, ouvre une application Maps (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'aucune KeyEvent
Android ne peut être utilisée 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 (HAL du véhicule). 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éfini comme 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'écran cible, tel que l'écran principal ou le cluster.
Le troisième élément indique 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é enfoncé.
CustomInputEvent et API Car Input
InputHalService est le service de voiture qui reçoit un HW_CUSTOM_INPUT
entrant à partir du HAL du véhicule.
InputHalService convertit le HW_CUSTOM_INPUT
entrant en CustomInputEvent
, une classe Java parcelable située dans car-lib/src/android/car/input, avec l'interface aidl correspondante.
CarInputService, un service d'entrée de voiture de base, 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.
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 diagramme suivant illustre le workflow 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 enregistrer 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 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 sur le volant. Lorsque vous appuyez sur ce nouveau bouton, 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 de commodité CustomInputEvent
) pour représenter cette nouvelle fonctionnalité (ouverture de l'application Maps avec l'emplacement actuel 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'intent pour démarrer l'application Maps. Pour savoir comment procéder, consultez CustomInputEventListener.java.