Используйте пользовательские входные данные 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 установлен как [только чтение] с помощью VehiclePropertyAccess:READ
.
Чтобы гарантировать, что HAL транспортного средства всегда может передавать последнее доступное значение, уведомление HW_CUSTOM_INPUT устанавливается как ON_CHANGE
с VehiclePropertyChangeMode:ON_CHANGE
.
Значения HW_CUSTOM_INPUT состоят из массива общих целых int32
, установленных как глобальные. Три общих целых числа:
Первый элемент представляет входной код, который должен быть определен OEM-производителем. Вы можете связать любую семантику с входным кодом.
Второй элемент хранит целевой дисплей, например основной дисплей или кластер.
Третий элемент содержит количество повторений события. Например, чтобы указать, сколько раз была нажата кнопка.
CustomInputEvent и API ввода автомобиля
InputHalService — это служба автомобилей, которая получает входящий HW_CUSTOM_INPUT
от HAL автомобиля.
InputHalService преобразует входящий HW_CUSTOM_INPUT
в CustomInputEvent
, пакетный класс Java, расположенный в car-lib/src/android/car/input , вместе с соответствующим интерфейсом helpl .
CarInputService , основная служба автомобильного ввода, получает входящие события CustomInputEvents, а затем отправляет их в любую зарегистрированную системную службу Android.
Для регистрации и получения входящих CustomInputEvents системные службы должны:
Реализуйте CarInputManager.CarInputCaptureCallback#onKeyEvents .
Зарегистрируйтесь через CarInputManager#requestInputEventCapture , передав
CarInputManager.INPUT_TYPE_CUSTOM_INPUT_EVENT
в качестве параметра типа ввода.Чтобы отменить регистрацию, службы должны вызвать CarInputManager#releaseInputEventCapture .
На следующей диаграмме показан рабочий процесс события пользовательского ввода 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 .