Ремонт, сервис, услуги » Информация » Поддержка для устройств ввода в Android своими руками




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

Автор: addministr от 12-12-2014, 11:40

Категория: Информация



Многие владельцы 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



Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Архив | Связь с админом | Конфиденциальность

RSS канал новостей     Яндекс.Метрика