Benutzerdefinierte OEM-Eingabe

Mit benutzerdefinierten OEM-Eingaben können Sie neue Car-Eingabeereignisse für neue und nicht standardmäßige Android-Funktionen hinzufügen. Nicht standardmäßige Eingabeereignisse werden nicht von der vorhandenen Android-KeyEvent zugeordnet, die für die allgemeine Verwendung auf jeder Android-Oberfläche konzipiert ist, aber nicht erweitert wurde, um OEM-spezifische Funktionen zu implementieren. Das kann beispielsweise eine Taste auf der Lenkradsteuerung sein, die beim Drücken eine Karten-App (über einen Intent) 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 wird, wenn keine Android-KeyEvent zur Darstellung des Features 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 Autohardware (Vehicle HAL) instanziiert wird. OEMs legen fest, wie dieses Ereignis instanziiert wird. Der Zugriff auf HW_CUSTOM_INPUT ist mit VehiclePropertyAccess:READ als [read only] festgelegt.

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

HW_CUSTOM_INPUT-Werte bestehen aus einem Array generischer int32, die als GLOBAL (mit VehicleArea:GLOBAL) festgelegt sind. Die drei generischen Ganzzahlen sind:

  1. Das erste Element stellt den Eingabecode dar, der vom OEM definiert werden muss. Sie können dem Eingabecode eine beliebige Semantik zuordnen.

  2. Das zweite Element enthält das Ziel-Display, z. B. das Hauptdisplay oder das Kombiinstrument.

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

CustomInputEvent und Car Input API

InputHalService ist der Car-Dienst, der ein eingehendes HW_CUSTOM_INPUT vom Vehicle HAL empfängt.

InputHalService konvertiert die eingehende HW_CUSTOM_INPUT in die CustomInputEvent, eine Java-Parcelable-Klasse in car-lib/src/android/car/input, zusammen mit der entsprechenden AIDL-Schnittstelle.

CarInputService, ein wichtiger Dienst für die Eingabe im Auto, empfängt eingehende CustomInputEvents und sendet sie dann an jeden registrierten Android-Systemdienst.

Damit Systemdienste eingehende CustomInputEvents registrieren und empfangen können, müssen sie:

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

Benutzerdefinierter Eingabeworkflow für OEMs

OEM-Android-Systemdienste

OEMs stellen ihren Android-Systemdienst zur Verarbeitung eingehender CustomInputEvents von CarInputService bereit.

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

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

Referenzimplementierung

Die Referenzimplementierung finden Sie unter packages/services/Car/tests/SampleCustomInputService. Sie dient als Beispiel und Richtlinie. So fügen Sie beispielsweise eine neue Taste in der Lenkradsteuerung hinzu. Wenn Sie diese neue Taste drücken, wird die Maps 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 (Öffnen der Karten-App mit dem aktuellen Standort des Autos) darzustellen.

Beim Start registriert sich dieser Dienst über requestInputEventCapture bei CarInputManager (siehe Registrierungscode der Referenzimplementierung).

Wenn dieser Dienst eingehende CustomInputEvents empfängt, sendet er die Absicht, die Maps App zu starten. Weitere Informationen dazu finden Sie unter CustomInputEventListener.java.