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

Используйте пользовательские входные данные OEM для добавления новых событий ввода Car для новых и нестандартных функций Android. Нестандартные события ввода не отображаются в существующем Android KeyEvent , который разработан как универсальный и работает на любой платформе Android, но не расширен для реализации функций, специфичных для OEM-производителей. Например, кнопка на рулевом колесе, нажатие которой открывает приложение «Карты» (через намерение) с текущим местоположением автомобиля. Эта функция позволяет водителям визуализировать свое текущее местоположение, не отвлекаясь во время вождения.

В этой статье описывается, как повторно использовать существующее событие Android KeyEvent для создания CustomInputEvent , который будет использоваться только в том случае, когда для представления функции невозможно использовать ни одно событие Android KeyEvent .

HW_CUSTOM_INPUT

Пользовательский вход OEM представлен HW_CUSTOM_INPUT и CustomInputEvent.java . HW_CUSTOM_INPUT — это нативное событие, создаваемое аппаратным обеспечением автомобиля (Vehicle HAL). Производители оборудования определяют, как создавать это событие. Доступ к HW_CUSTOM_INPUT устанавливается как [только для чтения] с помощью VehiclePropertyAccess:READ .

Чтобы гарантировать, что Vehicle HAL всегда может передавать последнее доступное значение, уведомление HW_CUSTOM_INPUT устанавливается как ON_CHANGE с VehiclePropertyChangeMode:ON_CHANGE .

Значения HW_CUSTOM_INPUT состоят из массива универсальных целых чисел int32 , установленных как GLOBALVehicleArea:GLOBAL ). Три универсальных целых числа:

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

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

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

CustomInputEvent и API ввода данных автомобиля

InputHalService — это служба автомобиля, которая получает входящий HW_CUSTOM_INPUT от HAL транспортного средства.

InputHalService преобразует входящий HW_CUSTOM_INPUT в CustomInputEvent , пакетируемый класс Java, расположенный в car-lib/src/android/car/input , вместе с соответствующим интерфейсом aidl .

CarInputService — основная служба ввода данных автомобиля, которая получает входящие события CustomInputEvents, а затем отправляет их любой зарегистрированной службе системы Android.

Для регистрации и получения входящих событий CustomInputEvents системные службы должны:

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

Рабочий процесс ввода пользовательских данных OEM

OEM-системные сервисы Android

Производители оригинального оборудования предоставляют свою системную службу Android для обработки входящих событий CustomInputEvents от CarInputService .

Только службы, отмеченные разрешением android.permission.INJECT_EVENTS , могут регистрироваться и получать события CustomInputEvents из API Car Input ( CarInputManager ). Ни одна сторонняя служба или приложение не могут быть подписаны с этим системным разрешением Android (только службы OEM). Следовательно, ни одна сторонняя служба или приложение не могут быть зарегистрированы в API Car Input.

Системные службы OEM Android могут получать доступ к SystemApi и публичным методам.

Референтная реализация

См. эталонную реализацию в packages/services/Car/tests/SampleCustomInputService , которая приведена в качестве примера и руководства. Например, чтобы добавить новую кнопку в элементы управления на руле, нажмите на эту кнопку, чтобы запустить приложение «Карты» с указанием текущего местоположения автомобиля.

В этом примере производитель оригинального оборудования выбрал INPUT_CODE_F1 (первая удобная функция CustomInputEvent ) для представления этой новой функции (открытие приложения «Карты» с указанием текущего местоположения автомобиля).

Во время запуска эта служба регистрируется в CarInputManager через requestInputEventCapture (см. регистрационный код реализации ссылки) .

При получении входящих событий CustomInputEvents эта служба отправляет намерение запустить приложение «Карты». Чтобы узнать, как это реализовано, см. CustomInputEventListener.java .