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

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

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

HW_CUSTOM_INPUT

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

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

Значения HW_CUSTOM_INPUT состоят из массива общих целых int32 , заданных как [global]{:.external} (с VehicleArea:GLOBAL ). Три общих целых числа:

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

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

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

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

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

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

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

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

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

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

OEM-системные услуги Android

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

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

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

Эталонная реализация

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

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

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

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