Entrées personnalisées OEM

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 :

  1. 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.

  2. Le deuxième élément stocke l'affichage cible, tel que l'affichage principal ou le cluster.

  3. 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 :

Le diagramme suivant illustre le flux de travail d'un événement d'entrée personnalisée OEM.

Flux de travail de saisie 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 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 .