Пользовательские входы OEM

Используйте пользовательские входы 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 , заданных как GLOBALVehicleArea:GLOBAL ). Три универсальных целых числа:

  1. Первый элемент представляет собой входной код, который должен быть определен производителем оборудования. К входному коду можно привязать любую семантику.

  2. Второй элемент хранит информацию о целевом дисплее, например, о главном дисплее или кластере.

  3. Третий элемент содержит количество повторений события. Например, для указания количества нажатий кнопки.

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 системные службы должны:

На следующей диаграмме показан рабочий процесс обработки события пользовательского ввода OEM-производителя.

Пользовательский рабочий процесс ввода 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 .