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 legen fest, wie dieses Ereignis instanziiert wird. Der Zugriff auf HW_CUSTOM_INPUT ist mit VehiclePropertyAccess:READ
auf „Lesezugriff“ 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:
Das erste Element steht für den vom OEM zu definierenden Eingabecode. Sie können dem Eingabecode eine beliebige Semantik zuordnen.
Das zweite Element speichert das Zieldisplay, z. B. das Hauptdisplay oder den Cluster.
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 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 ist ein zentraler Dienst für die Eingabe im Auto. Er empfängt eingehende CustomInputEvents und sendet sie an einen beliebigen registrierten Android-Systemdienst.
Damit Systemdienste eingehende CustomInputEvents registrieren und empfangen können, müssen folgende Voraussetzungen erfüllt sein:
Implementieren Sie CarInputManager.CarInputCaptureCallback#onKeyEvents.
Registrieren Sie sich über CarInputManager#requestInputEventCapture und geben Sie
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
als Parameter für den Eingabetyp an.Zum Abmelden müssen Dienste CarInputManager#releaseInputEventCapture aufrufen.
Das folgende Diagramm veranschaulicht den Workflow eines benutzerdefinierten OEM-Eingabeereignisses.
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
Sehen Sie sich die Referenzimplementierung unter packages/services/Car/tests/SampleCustomInputService an. Sie dient als Beispiel und als Richtlinie. 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).
Wenn dieser Dienst eingehende CustomInputEvents empfängt, sendet er die Intent, um die Karten-App zu starten. Weitere Informationen finden Sie unter CustomInputEventListener.java.