Вградена поддръжка за входни устройства „Направи си сам“ в Android
Много собственици на устройства с Android са се сблъскали с факта, че свързаните с USB входни устройства като джойстици, клавиатури, мишки и т.н. не винаги работят според очакванията. Или бутоните на джойстика са разбъркани, или медийните клавиши на клавиатурата или мишката не работят и т.н. В моя случай геймпадът беше определен като клавиатура и трябваше да използвам софтуерна „патерица“, като USB BT Joystick center или Tincore keymapper. Което, използвайки техния IME (метод на въвеждане на Android), ви позволява да пренасочвате бутони. Използвах и програмата PerApp, която може автоматично да превключва IME в зависимост от активното приложение. Този метод ме раздразни, защото когато включих цялата тази икономика, не можех да използвам любимата си клавиатура, а когато беше изключен, беше невъзможно да движа джойстика около системния интерфейс. Видях само един изход: да направя родна поддръжка за моя геймпад в системата или, грубо казано, „драйвер“.
ключ 289 BUTTON_A
ключ 290 BUTTON_B
ключ 297 BUTTON_START
ключ 296 BUTTON_SELECT
ос 0x00 HAT_X
Да, да, това са настройките на бутоните за джойстика от Nintendo (Dandy). Преглеждайки съседните файлове, намерих конфигурации за различни устройства. Предимно контролери за игри (Play Station 3, X-box, ASUS gamepad и други), но има и клавиатури.
Въз основа на гореизложеното вече може да се разбере, че за да добавите поддръжка на устройство на системно ниво, трябва да създадете файл с VID и PID на устройството в името и да запишете стойностите на бутоните в него.
От теория към практика
-
andro device >Свържете нашето входно устройство и стартирайте приложението за информация за USB устройството. Интересуваме се от раздела Linux, в който избираме нашето устройство (имах го последно в списъка) и търсим стойностите на редовете Vendor ID и ProductДОКУМЕНТ ЗА САМОЛИЧНОСТ. В моя случай това бяха съответно 0c45 и 7700.

Копираме всеки файл от /system/usr/keylayout на sdcard и го преименуваме според получените данни, за моя джойстик името се оказа Vendor_0c45_Product_7700.kl. (Имайте предвид, че главните букви имат значение)
2. Получаване на кодове на бутони
Стартираме приложението KeyTest и, въоръжени с хартия и молив, започваме да натискаме бутоните на устройството един по един, записвайки числата, показани след scanCode =. Записах кодовете, като ги поставих на хартия като бутони на геймпад. Можете да излезете от програмата само чрез натискане на бутона "Начало".

3. Картографиране на бутони
Сега, когато кодовете на всички ключове са станали известни, е необходимо да се регистрират техните функции. Тук има два начина:
а) намерете сред наличните конфигурации в Android устройство, което е възможно най-близко до вашето, и просто променете кодовете на бутоните в него, като копирате съдържанието във вашия файл;
б) напишете всичко сами.
Аз избрах втория начин, защото джойстикът ми има само контролен d-pad и четири бутона. Първо трябва да разберете синтаксиса на файла с оформлението, той е много прост:
ключбутон_код бутон_действие
Но тогава възникна въпросът: какви действия на бутоните трябва да бъдат записани в конфигурацията? В продължение на много години използване на различни геймпадове на Android, аз определих за себе си, че най-универсалната конфигурация е оформлението от Sony Xperia Play, тя се държи еднакво добре както в игрите, така и в системния интерфейс.
Ok Google, съпоставяне на клавиши за Xperia Play
X 23 KEYCODE_DPAD_CENTER 304
кръг 4 KEYCODE_BACK 305
квадрат 99 KEYCODE_BUTTON_X 307
триъгълник 100 KEYCODE_BUTTON_Y 308
нагоре 19 KEYCODE_DPAD_UP 106
надолу 20 KEYCODE_DPAD_DOWN 105
ляво 21KEYCODE_DPAD_LEFT 103
дясно 22 KEYCODE_DPAD_RIGHT 108
изберете 109 KEYCODE_BUTTON_SELECT 314
начало 108 KEYCODE_BUTTON_START 28
L тригер 102 KEYCODE_BUTTON_L1 310
R тригер 103 KEYCODE_BUTTON_R1 311
Интересуваме се от третата колона, но записът на действията в нея е малко по-различен от тези в системата - това не е пречка, просто премахваме KEYCODE_.
Предписвам моите бутони (помните ли листа с бележки с молив? Време е да го намерите.):
ключ 149 BUTTON_B
ключ 148 BUTTON_Y
ключ 146 BUTTON_X
ключ 157 DPAD_DOWN
ключ 145 DPAD_LEFT
ключ 155 DPAD_UP
ключ 156 DPAD_RIGHT
Но дори и тук не беше без нюанси. Sony присвои действието KEYCODE_BACK на кръглия бутон (бутонът за връщане назад, с който сме свикнали). Лесно е да се досетите, че натискането на такъв бутон в играта може да причини нервен срив. И работата е там, че докато играете на Xplay, този бутон приема алтернативна стойност - KEYCODE_BUTTON_B. Тук ще го запишем.
4. Моментът на истината
Запазваме нашия файл и го копираме в папката /system/usr/keylayout. Задаваме правата -rw -r -r (644). Рестартираме устройството (не го направих сам, просто го блокирах и деблокирах, но заради съвестта и експеримента трябваше да го напиша).
Свързваме нашето устройство и ако всичко е направено правилно, можете веднага да навигирате в менюто на Android с "кръст". Бутонът, присвоен на DPAD_CENTER, ще бъде бутонът за избор, а BUTTON_B ще бъде бутонът за връщане назад.