Используйте пользовательские входы OEM для добавления новых событий ввода автомобиля для новых и нестандартных функций Android. Нестандартные события ввода не обрабатываются существующим Android KeyEvent , который разработан как универсальный и работающий на любой платформе Android, но не расширен для реализации специфических для OEM функций. Например, кнопка на рулевом колесе, при нажатии которой открывается приложение карт (через Intent) с текущим местоположением автомобиля. Эта функция позволяет водителям визуализировать свое текущее местоположение, не отвлекаясь во время вождения.
В этой статье описывается, как повторно использовать существующий объект Android KeyEvent для создания объекта CustomInputEvent , который будет использоваться только в тех случаях, когда для представления данной функции нельзя использовать объект Android KeyEvent .
HW_CUSTOM_INPUT
Пользовательский ввод OEM-производителя представлен событиями HW_CUSTOM_INPUT и файлом CustomInputEvent.java . HW_CUSTOM_INPUT — это собственное событие, создаваемое аппаратным обеспечением автомобиля (Vehicle HAL). OEM-производители определяют способ создания этого события. Доступ к HW_CUSTOM_INPUT устанавливается как [только для чтения] с VehiclePropertyAccess:READ .
Чтобы гарантировать, что HAL транспортного средства всегда сможет передавать последнее доступное значение, уведомление HW_CUSTOM_INPUT устанавливается в состояние ON_CHANGE с параметром VehiclePropertyChangeMode:ON_CHANGE .
Значения HW_CUSTOM_INPUT представляют собой массив универсальных целых чисел типа int32 , заданных как GLOBAL (с VehicleArea:GLOBAL ). Три универсальных целых числа:
Первый элемент представляет собой входной код, который должен быть определен производителем оборудования. К входному коду можно привязать любую семантику.
Второй элемент хранит информацию о целевом дисплее, например, о главном дисплее или кластере.
Третий элемент содержит количество повторений события. Например, для указания количества нажатий кнопки.
API для ввода данных о пользовательском входе и автомобиле
InputHalService — это служба Car, которая принимает входящий HW_CUSTOM_INPUT от Vehicle HAL.
InputHalService преобразует входящий HW_CUSTOM_INPUT в CustomInputEvent — Java-класс, реализующий интерфейс Parcelable и расположенный в car-lib/src/android/car/input , вместе с соответствующим интерфейсом aidl .
CarInputService , основной сервис ввода данных в автомобиль, принимает входящие события CustomInputEvents и затем отправляет их в любой зарегистрированный системный сервис Android.
Для регистрации и получения входящих событий CustomInputEvents системные службы должны:
Реализуйте метод CarInputManager.CarInputCaptureCallback#onKeyEvents .
Зарегистрируйте событие с помощью метода CarInputManager#requestInputEventCapture , передав в качестве параметра типа ввода
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT.Для отмены регистрации службам необходимо вызвать метод CarInputManager#releaseInputEventCapture .
На следующей диаграмме показан рабочий процесс обработки события пользовательского ввода OEM-производителя.

OEM-сервисы системы Android
Производители автомобилей предоставляют свою системную службу Android для обработки входящих событий CustomInputEvents от CarInputService .
Только те сервисы, которые отмечены разрешением android.permission.INJECT_EVENTS , могут регистрироваться и получать CustomInputEvents от Car Input API ( CarInputManager ). Никакие сторонние сервисы или приложения не могут быть подписаны с этим системным разрешением Android (только сервисы OEM). Следовательно, никакие сторонние сервисы или приложения не могут зарегистрироваться в Car Input API.
Системные службы Android от производителя могут получать доступ к SystemApi и публичным методам.
Эталонная реализация
См. пример реализации в packages/services/Car/tests/SampleCustomInputService , который предоставляется в качестве примера и руководства. Например, чтобы добавить новую кнопку на панель управления на рулевом колесе. При нажатии эта новая кнопка запускает приложение карт с текущим местоположением автомобиля.
В этом примере производитель выбрал INPUT_CODE_F1 (первая вспомогательная функция CustomInputEvent ) для представления этой новой функции (открытие приложения карт с текущим местоположением автомобиля).
При запуске эта служба регистрируется в CarInputManager через requestInputEventCapture (см. эталонный код регистрации в реализации ).
При получении входящих событий CustomInputEvent этот сервис отправляет намерение запустить приложение карт. Чтобы узнать, как это делается, см. файл CustomInputEventListener.java .