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 generisch ist und auf jeder Android-Oberfläche funktioniert, aber nicht erweitert wurde, um OEM-spezifische Funktionen zu implementieren. Ein Beispiel ist eine Taste auf der Lenkradsteuerung, 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 sehen, ohne während der Fahrt abgelenkt zu werden.

In diesem Artikel wird beschrieben, wie Sie ein vorhandenes Android-KeyEvent verwenden, um ein CustomInputEvent zu erstellen, das nur verwendet wird, wenn kein 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 Fahrzeughardware (Fahrzeug-HAL) instanziiert wird. OEMs legen fest, wie dieses Ereignis instanziiert wird. Der Zugriff auf HW_CUSTOM_INPUT ist mit VehiclePropertyAccess:READ als [Lesezugriff] festgelegt.

Damit die Fahrzeug-HAL immer den neuesten verfügbaren Wert übertragen kann, wird die Benachrichtigung HW_CUSTOM_INPUT als ON_CHANGE mit 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 Fahrzeug-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 Eingabedienst für das 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 bereit, um eingehende CustomInputEvents von CarInputService zu verarbeiten.

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 ‑anwendung kann mit dieser Android-Systemberechtigung signiert werden (nur OEM-Dienste). Daher kann kein Drittanbieterdienst oder ‑anwendung 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 darauf tippen, 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 (Ö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.