Użyj niestandardowych danych wejściowych OEM, aby dodać nowe zdarzenia wejściowe samochodu dla nowych i niestandardowych funkcji Androida. Niestandardowe zdarzenia wejściowe nie są mapowane przez istniejący interfejs KeyEvent
Androida, który jest zaprojektowany jako ogólny i działa na dowolnej powierzchni Androida, ale nie został rozszerzony o funkcje specyficzne dla producenta OEM. Przykładem jest przycisk na kierownicy, który po naciśnięciu otwiera aplikację map (za pomocą intencji) z bieżącą lokalizacją samochodu. Ta funkcja umożliwia kierowcom sprawdzenie bieżącej lokalizacji bez rozpraszania uwagi podczas jazdy.
Z tego artykułu dowiesz się, jak ponownie użyć istniejącego elementu KeyEvent
na Androida, aby utworzyć element CustomInputEvent
do użycia tylko wtedy, gdy do przedstawienia funkcji nie można użyć elementu KeyEvent
na Androida.
HW_CUSTOM_INPUT
Niestandardowe dane wejściowe OEM są reprezentowane przez HW_CUSTOM_INPUT i CustomInputEvent.java. HW_CUSTOM_INPUT to zdarzenie natywne, tworzone przez sprzęt samochodowy (Vehicle HAL). Producenci OEM określają, w jaki sposób to zdarzenie ma być tworzone. Dostęp do HW_CUSTOM_INPUT jest ustawiony jako [tylko do odczytu] z wartością VehiclePropertyAccess:READ
.
Aby zapewnić, że HAL pojazdu zawsze może przesyłać najnowszą dostępną wartość, powiadomienie HW_CUSTOM_INPUT jest ustawione jako ON_CHANGE
z wartością VehiclePropertyChangeMode:ON_CHANGE
.
Wartości HW_CUSTOM_INPUT składają się z tablicy ogólnych liczb całkowitych
int32
, ustawionych jako GLOBAL
(z VehicleArea:GLOBAL
). Trzy
ogólne liczby całkowite to:
Pierwszy element to kod wejściowy, który ma być zdefiniowany przez producenta OEM. Z kodem wejściowym możesz skojarzyć dowolną semantykę.
Drugi element zawiera docelowy wyświetlacz, np. wyświetlacz główny lub klaster.
Trzeci element zawiera liczbę powtórzeń zdarzenia. Na przykład aby wskazać, ile razy naciśnięto przycisk.
CustomInputEvent i Car Input API
InputHalService to usługa samochodowa, która odbiera przychodzące HW_CUSTOM_INPUT
z Vehicle HAL.
InputHalService przekształca przychodzące HW_CUSTOM_INPUT
w CustomInputEvent
, czyli klasę parcelable w Javie, która znajduje się w car-lib/src/android/car/input, oraz odpowiedni interfejs AIDL.
CarInputService, podstawowa usługa wprowadzania danych w samochodzie, odbiera przychodzące zdarzenia CustomInputEvents, a następnie wysyła je do dowolnej zarejestrowanej usługi systemowej Androida.
Aby zarejestrować i otrzymywać przychodzące zdarzenia CustomInputEvents, usługi systemowe muszą:
Zaimplementuj CarInputManager.CarInputCaptureCallback#onKeyEvents.
Zarejestruj się za pomocą interfejsu CarInputManager#requestInputEventCapture, przekazując
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
jako parametr typu wejścia.Aby wyrejestrować usługę, musi ona wywołać metodę CarInputManager#releaseInputEventCapture.
Diagram poniżej przedstawia proces obsługi zdarzenia niestandardowego wejścia OEM.
Usługi systemowe Androida OEM
Producenci OEM udostępniają usługę systemową Androida, która obsługuje przychodzące zdarzenia CustomInputEvents z CarInputService
.
Tylko usługi oznaczone uprawnieniem android.permission.INJECT_EVENTS mogą rejestrować i otrzymywać zdarzenia CustomInputEvents z interfejsu Car Input API (CarInputManager). Żadna usługa ani aplikacja innej firmy nie może być podpisana tym uprawnieniem systemu Android (tylko usługi OEM). Dlatego żadna usługa ani aplikacja innej firmy nie może zarejestrować się w interfejsie Car Input API.
Usługi systemowe Androida OEM mogą uzyskiwać dostęp do SystemApi
i metod publicznych.
Implementacja referencyjna
Zobacz implementację referencyjną w packages/services/Car/tests/SampleCustomInputService, która jest podana jako przykład i wskazówka. Na przykład, aby dodać nowy przycisk w sterowaniu na kierownicy. Po naciśnięciu tego nowego przycisku uruchamia się aplikacja Mapy z aktualną lokalizacją samochodu.
W tym przykładzie producent OEM wybrał INPUT_CODE_F1
(pierwszą funkcję CustomInputEvent
ułatwiającą korzystanie z samochodu), aby reprezentować tę nową funkcję (otwieranie aplikacji Mapy z bieżącą lokalizacją samochodu).
Podczas uruchamiania ta usługa rejestruje się w CarInputManager
za pomocą requestInputEventCapture
(zobacz kod rejestracji implementacji referencyjnej).
Gdy ta usługa odbiera przychodzące zdarzenia CustomInputEvent, wysyła intencję uruchomienia aplikacji Mapy. Aby dowiedzieć się, jak to zrobić, zapoznaj się z plikiem CustomInputEventListener.java.