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:
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 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:
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 Aufheben der Registrierung 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
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.