Benutzerdefinierte OEM-Eingaben

Verwenden Sie benutzerdefinierte OEM-Eingabeelemente, um neue Eingabeereignisse für neue und nicht standardmäßige Android-Funktionen hinzuzufügen. Nicht standardmäßige Eingabeereignisse werden von der vorhandenen Android-KeyEvent nicht zugeordnet. Diese ist zwar generisch und funktioniert auf allen Android-Oberflächen, wurde aber nicht erweitert, um OEM-spezifische Funktionen zu implementieren. Beispiel: Eine Taste am Lenkrad, die beim Drücken (über einen Intent) eine Karten-App mit dem aktuellen Standort des Autos öffnet. Mit dieser Funktion können Fahrer ihren aktuellen Standort visualisieren, ohne während der Fahrt abgelenkt zu werden.

In diesem Artikel wird beschrieben, wie Sie eine vorhandene Android-KeyEvent wiederverwenden, um eine CustomInputEvent zu erstellen, die nur verwendet werden kann, wenn keine Android-KeyEvent zur Darstellung der Funktion verwendet werden kann.

HW_CUSTOM_INPUT

Eine benutzerdefinierte OEM-Eingabe wird durch HW_CUSTOM_INPUT und CustomInputEvent.java dargestellt. HW_CUSTOM_INPUT ist das native Ereignis, das von der Fahrzeughardware (Vehicle HAL) erstellt wird. OEMs bestimmen, wie dieses Ereignis instanziiert wird. Der Zugriff auf HW_CUSTOM_INPUT ist auf [read only] mit VehiclePropertyAccess:READ festgelegt.

Damit die Vehicle HAL immer den neuesten verfügbaren Wert übertragen kann, wird die Benachrichtigung HW_CUSTOM_INPUT auf ON_CHANGE mit VehiclePropertyChangeMode:ON_CHANGE festgelegt.

HW_CUSTOM_INPUT-Werte bestehen aus einem Array von generischen int32, die als global festgelegt sind. Die drei generischen Ganzzahlen sind:

  1. Das erste Element steht für den vom OEM zu definierenden Eingabecode. Sie können dem Eingabecode eine beliebige Semantik zuordnen.

  2. Das zweite Element speichert das Zieldisplay, z. B. das Hauptdisplay oder den Cluster.

  3. Das dritte Element enthält die Anzahl der Wiederholungen des Ereignisses. Beispielsweise, um anzuzeigen, wie oft eine Schaltfläche gedrückt wurde.

CustomInputEvent und Car Input API

InputHalService ist der Autodienst, der eine eingehende HW_CUSTOM_INPUT vom Vehicle HAL empfängt.

InputHalService wandelt die eingehende HW_CUSTOM_INPUT in die CustomInputEvent um, eine Java-Klasse vom Typ Parcelable, die sich in car-lib/src/android/car/input zusammen mit der entsprechenden Aidl-Schnittstelle befindet.

CarInputService, ein zentraler Car InputService, empfängt eingehende CustomInputEvents und sendet sie dann an einen registrierten Android-Systemdienst.

Damit Systemdienste eingehende CustomInputEvents registrieren und empfangen können, müssen folgende Voraussetzungen erfüllt sein:

Das folgende Diagramm veranschaulicht den Workflow eines benutzerdefinierten OEM-Eingabeereignisses.

Workflow für benutzerdefinierte OEM-Eingabe

OEM-Android-Systemdienste

OEMs stellen ihren Android-Systemdienst bereit, um eingehende CustomInputEvents von CarInputService zu verarbeiten.

Nur Dienste, die mit der Berechtigung android.permission.INJECT_EVENTS gekennzeichnet sind, können CustomInputEvents von der Car Input API (CarInputManager) registrieren und empfangen. Kein Drittanbieterdienst oder keine Drittanbieteranwendung darf mit dieser Android-Systemberechtigung signiert werden (nur OEM-Dienste). Daher kann sich kein Drittanbieterdienst oder keine Drittanbieteranwendung bei der Car Input API registrieren.

OEM-Android-Systemdienste können auf SystemApi und öffentliche Methoden zugreifen.

Referenzimplementierung

Weitere Informationen finden Sie in der Referenzimplementierung unter packages/services/Car/tests/SampleCustomInputService. Beispiel: Sie möchten eine neue Schaltfläche in die Lenkradsteuerung einfügen. Wenn Sie diese neue Schaltfläche drücken, wird die Karten-App mit dem aktuellen Standort des Autos gestartet.

In diesem Beispiel hat der OEM INPUT_CODE_F1 (die erste CustomInputEvent-Komfortfunktion) ausgewählt, um diese neue Funktion darzustellen (Öffnen der Karten-App mit dem aktuellen Standort des Autos).

Beim Starten registriert sich dieser Dienst bei CarInputManager bis requestInputEventCapture (siehe Registrierungscode der Referenzimplementierung).

Beim Empfang eingehender CustomInputEvents sendet dieser Dienst den Intent zum Starten der Karten-App. Informationen dazu, wie dies erreicht wird, findest du unter CustomInputEventListener.java.