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:
Das erste Element stellt den Eingabecode dar, der vom OEM definiert werden muss. Sie können dem Eingabecode eine beliebige Semantik zuordnen.
Das zweite Element enthält das Ziel-Display, z. B. das Hauptdisplay oder das Kombiinstrument.
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:
Implementieren Sie CarInputManager.CarInputCaptureCallback#onKeyEvents.
Registrieren Sie sich über CarInputManager#requestInputEventCapture und übergeben Sie
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
als Parameter für den Eingabetyp.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 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.