Нативная поддержка для устройств ввода в Android своими руками

:

Многие владельцы Android-устройств сталкивались с тем, что подключаемые по USB устройства ввода, такие как джойстики, клавиатуры, мышки и т.д., не всегда работают, как положено. То кнопки джойстика перепутаны, то медиаклавиши на клавиатуре или мышке не работают и т.п. В моём случае геймпад определялся, как клавиатура, и приходилось использовать программный «костыль», типа USB BT Joystick center или Tincore keymapper. Которые, используя свой IME (метод ввода в Android), позволяют переназначить кнопки. Также использовалась программа PerApp, которая может автоматически переключать IME в зависимости от активного приложения. Данный способ меня раздражал тем, что при включении всего этого хозяйства я не мог пользоваться любимой клавиатурой, а при выключении нельзя было перемещаться джойстиком по интерфейсу системы. Выход я видел только один: сделать нативную поддержку своего геймпада в системе или, грубо говоря, «драйвер».

Первым делом я заглянул в папку /system/usr/keylayout, где обнаружил файлы с очень красноречивыми названиями: Vendor_xxxx_Product_xxxx.kl, где xxxx - это набор цифр и букв. Как уже многие догадались, это не что иное, как идентификаторы устройства (VID и PID). Открыв первый по списку файл в текстовом редакторе, я почти закричал «БИНГО!». Но не закричал, потому что на работе нужно работать, а не джойстики к планшету прикручивать. А увидел я вот что:

# Classic NES Controller

key 289 BUTTON_A

key 290 BUTTON_B

key 297 BUTTON_START

key 296 BUTTON_SELECT

axis 0x00 HAT_X

axis 0x01 HAT_Y

Да-да, это настройки кнопок для джойстика от Nintendo (Денди). Просмотрев соседние файлы, я обнаружил конфиги для различных устройств. В основном игровые контроллеры (Play Station 3, X-box, ASUS gamepad и другие), но есть и клавиатуры.

Исходя из вышесказанного, уже можно понять, что для добавления поддержки устройства на уровне системы нужно создать файл с VID и PID устройства в названии и прописать в нем значения кнопок.

 

От теории к практике

Инструментарий:

  • устройство на Android 4+ (проверял только на 5.0 и 4.4);
  • поддержка устройством USB OTG;
  • наличие root-доступа;
  • файловый менеджер с поддержкой root (в моём случае это Total Commander);
  • текстовый редактор (в моём случае это опять Total Сommander);
  • лист бумаги и карандаш;
  • USB Device Info (для определения свойств устройства);
  • KeyTest (для отображения кодов кнопок устройства).

1. Создание файла с VID и PID

Подключаем наше устройство ввода и запускаем приложение USB Device Info. Нас интересует вкладка Linux, в которой выбираем своё устройство (у меня оно было последним в списке) и ищем значения строчек Vendor ID и Product ID. В моём случае это были 0c45 и 7700 соответственно.

Нативная поддержка для устройств ввода в Android своими руками

Копируем любой файл из /system/usr/keylayout на sdcard и переименовываем его в соответствии с полученными данными, для моего джойстика название получилось таким: Vendor_0c45_Product_7700.kl. (Обратите внимание, что регистр букв имеет значение)

 

2. Получение кодов кнопок

Запускаем приложение KeyTest и, вооружившись бумагой и карандашом, начинаем поочерёдно нажимать кнопки на устройстве, записывая цифры, высвечивающиеся после scanCode=. Я записывал коды, располагая их на бумаге, как кнопки на геймпаде. Из программы можно выйти только по кнопке «Домой».

Нативная поддержка для устройств ввода в Android своими руками

 

3. Маппинг кнопок

Теперь, когда стали известны коды всех клавиш, необходимо прописать их функции. Тут есть два пути:

а) найти среди имеющихся в Android конфигов устройство, максимально приближенное к вашему, и просто изменить в нём коды кнопок, скопировав содержимое в свой файл;

б) прописать все самому.

Я пошёл по второму пути, ибо мой джойстик имеет только крестовину управления и четыре кнопки. Для начала нужно понять синтаксис файла раскладки, он очень прост:

key код_кнопки действие_кнопки

Но тут возник вопрос: а какие действия кнопок писать в конфиге? За много лет использования различных геймпадов на Android я для себя определил, что самый универсальный конфиг — это раскладка от Sony Xperia Play, она одинаково хорошо ведёт себя как в играх, так и в интерфейсе системы.

Ok Google, key mapping for Xperia Play

Key code constant scancode

X 23 KEYCODE_DPAD_CENTER 304

circle 4 KEYCODE_BACK 305

square 99 KEYCODE_BUTTON_X 307

triangle 100 KEYCODE_BUTTON_Y 308

up 19 KEYCODE_DPAD_UP 106

down 20 KEYCODE_DPAD_DOWN 105

left 21 KEYCODE_DPAD_LEFT 103

right 22 KEYCODE_DPAD_RIGHT 108

select 109 KEYCODE_BUTTON_SELECT 314

start 108 KEYCODE_BUTTON_START 28

L trigger 102 KEYCODE_BUTTON_L1 310

R trigger 103 KEYCODE_BUTTON_R1 311

Нас интересует третья колонка, но запись действий в ней немного отличается от тех, что были найдены в системе — это не помеха, просто убираем KEYCODE_.

Прописываю свои кнопки (помните листок с карандашными записями? Самое время найти его...):

key 147 DPAD_CENTER

key 149 BUTTON_B

key 148 BUTTON_Y

key 146 BUTTON_X

key 157 DPAD_DOWN

key 145 DPAD_LEFT

key 155 DPAD_UP

key 156 DPAD_RIGHT

Но и тут не обошлось без нюансов. У Sony на кнопку «круг» (circle) назначено действие KEYCODE_BACK (привычная нам кнопка «назад»). Несложно догадаться, что нажатие такой кнопки в игре может вызвать нервный срыв. А всё дело в том, что во время игры на Xplay эта кнопка принимает альтернативное значение — KEYCODE_BUTTON_B. Вот её мы и пропишем.

 

4. Момент истины

Сохраняем наш файл и копируем его в папку /system/usr/keylayout. Выставляем права -rw -r -r (644). Перезагружаем устройство (сам я этого не делал, просто заблокировал и разблокировал, но для чистоты совести и эксперимента обязан был это написать).

Подключаем наше устройство, и если всё сделали правильно, тут же сможете «крестовиной» перемещаться по меню Android. Кнопка, на которую назначили DPAD_CENTER, будет кнопкой выбора, а BUTTON_B — кнопкой «назад».

 

Итоги

  • на планшете стало на две программы меньше;
  • джойстик теперь реальный Plug and Play;
  • можно играть в игры с маркета без танцев с бубном (если игра поддерживает геймпады);
  • можно перемещаться по интерфейсу Android;
  • свои настройки для каждого устройства;
  • скорость отклика кнопок повысилась (плацебо?).

Полезная информация

Настроить можно не только нажатие, но и смещение по осям (аналоговые контроллеры, мышки).

Полный список кодов действий.

 

Тема на форуме: Нативная поддержка для устройств ввода в Андроид своими руками

Источник:  4pda.ru