Корзина
+7(342) 287-18-82 +7(909)114-59-59 Режим работы

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

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


Нативная поддержка для устройств ввода в 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 соответственно.

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

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

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

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;
  • свои настройки для каждого устройства;
  • скорость отклика кнопок повысилась (плацебо?).

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

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


Назад



На данном сайте используются cookie-файлы. Используя данный сайт, вы даете свое согласие на использование нами cookie-файлов. Подробнее.