Używaj niestandardowych danych wejściowych OEM, aby dodawać nowe zdarzenia danych wejściowych Car w przypadku nowych i niestandardowych funkcji Androida. Niestandardowe zdarzenia wejścia nie są mapowane przez istniejące API Androida KeyEvent
, które zostało zaprojektowane jako uniwersalne i ma działać na dowolnej powierzchni z Androidem, ale nie zostało rozszerzone o wdrożenie funkcji specyficznych dla producenta OEM. Może to być na przykład przycisk na kierownicy, który po naciśnięciu otwiera aplikację map (za pomocą intencji) z aktualną lokalizacją samochodu. Ta funkcja umożliwia kierowcom wizualizację ich bieżącej lokalizacji bez rozpraszania uwagi podczas jazdy.
Z tego artykułu dowiesz się, jak ponownie użyć istniejącego Androida KeyEvent
, aby utworzyć CustomInputEvent
do użycia tylko wtedy, gdy nie można użyć Androida KeyEvent
do reprezentowania danej funkcji.
HW_CUSTOM_INPUT
Dane wejściowe niestandardowe OEM są reprezentowane przez HW_CUSTOM_INPUT i CustomInputEvent.java. HW_CUSTOM_INPUT to zdarzenie natywne, tworzone przez sprzęt samochodowy (interfejs HAL pojazdu). Producenci OEM określają, jak instancjonować to zdarzenie. Dostęp do HW_CUSTOM_INPUT jest ustawiony jako [tylko do odczytu] za pomocą VehiclePropertyAccess:READ
.
Aby zapewnić, że interfejs HAL pojazdu może zawsze przekazywać 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
ustawionej jako globalna. Te 3 ogólne liczby całkowite to:
Pierwszy element reprezentuje kod wejściowy zdefiniowany przez producenta OEM. Z kodem wejściowym możesz powiązać dowolną semantykę.
Drugi element przechowuje wyświetlacz docelowy, np. wyświetlacz główny lub klaster.
Trzeci element zawiera liczbę powtórzeń zdarzenia. Na przykład, aby wskazać, ile razy został wciśnięty przycisk.
Interfejsy API CustomInputEvent i Car Input
InputHalService to usługa Car, która otrzymuje przychodzące daneHW_CUSTOM_INPUT
z interfejsu HAL pojazdu.
Usługa InputHalService konwertuje przychodzące dane HW_CUSTOM_INPUT
na CustomInputEvent
, czyli klasę Java parcelable znajdującą się w car-lib/src/android/car/input wraz z odpowiednim interfejsem aidl.
CarInputService, podstawowa usługa CarInput, odbiera przychodzące CustomInputEvents, a następnie wysyła je do dowolnej zarejestrowanej usługi systemowej Androida.
Aby rejestrować i odbierać przychodzące zdarzenia CustomInputEvent, usługi systemowe muszą:
Zaimplementuj metodę CarInputManager.CarInputCaptureCallback#onKeyEvents.
Zarejestruj się za pomocą metody CarInputManager#requestInputEventCapture, podając parametr inputType o wartości
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
.Aby anulować rejestrację, usługi muszą wywołać metodę CarInputManager#releaseInputEventCapture.
Ten diagram przedstawia przepływ danych w przypadku zdarzenia OEM Custom Input.
Usługi systemowe Androida OEM
Producenci urządzeń oryginalnych udostępniają usługę systemową Androida, która obsługuje przychodzące CustomInputEvents z CarInputService
.
Tylko usługi oznaczone uprawnieniem android.permission.INJECT_EVENTS mogą rejestrować i odbierać zdarzenia CustomInput 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 rejestrować się w interfejsie Car Input API.
Usługi systemowe Androida OEM mogą mieć dostęp do SystemApi
i publicznych metod.
Implementacja referencyjna
Zobacz implementację referencyjną w pliku packages/services/Car/tests/SampleCustomInputService, który służy jako przykład i wytyczne. Na przykład dodanie nowego przycisku w sterowaniu kierownicą. 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
(pierwsza CustomInputEvent
funkcja ułatwiająca korzystanie z aplikacji) jako reprezentującą nową funkcję (otwieranie aplikacji Mapy z aktualną lokalizacją samochodu).
Podczas uruchamiania ta usługa rejestruje się w usłudze CarInputManager
za pomocą usługi requestInputEventCapture
(patrz kod rejestracji implementacji referencyjnej).
Po otrzymaniu zdarzeń CustomInputEvents usługa wysyła intencję, aby uruchomić aplikację Mapy. Aby dowiedzieć się, jak to działa, zapoznaj się z klasą CustomInputEventListener.java.