HimeraSearchDB
Carding_EbayThief
triada
CrackerTuch
d-shop
HimeraSearchDB

НОВОСТИ Кастомизируем раскладку внешней клавиатуры на Android без root

Bonnie
Оффлайн
Регистрация
12.04.17
Сообщения
19.095
Реакции
107
Репутация
0
Мне нравится раскладка клавиатур на Mac: Cmd(Ctrl) под большим пальцем и возможность, без шаманства, прямо в настройках изменить поведение CapsLock. Такого же результата легко добиться в Linux с помощью setxkbmap в консоли или, например, gnome-tweak-tool в UI. Но что делать, если клавиатура подключается к Android?
rebum-mogfz-cje8wlgsfbh12fy.jpeg




В Android существует несколько способов кастомизировать внешнюю клавиатуру:

  1. Установка сторонней клавиатуры. Например, .
  2. Правка/добавление или файлов (требуется root). Как, например, в посте.
  3. Установка приложения, которое добавляет .


Устанавливать стороннюю клавиатуру не хочется. Рутовать телефон — тоже. Остаётся третий вариант.

Теория



Вкратце пробежимся по основным понятиям со ссылками на документацию.

Key Layout файлы



(.kl) файлы отображают линуксовые коды клавиш (Linux Key Code) на андродовские клавиши (Android Key). Отображение по-умолчанию можно посмотреть . Узнать, какая клавиша на клавиатуре какой код производит, можно, например, с помощью .

Key Character Map файлы



(.kcm) файлы позволяют задать поведение для сочетания клавиш, а также нужны для добавления раскладок, отличных от English(US).

Дополнительные клавиатурные раскладки



Начиная с версии в Android стало возможным устанавливать вместе с приложением дополнительные раскладки клавиатуры. После установки раскладки доступны в Settings -> Language & input -> Physical keyboard. Минус этого подхода в том, что раскладки неизменяемы, и нет возможности кастомизировать их "на лету".

Практика



Вот что я хочу получить для моей клавиатуры:

  • Esc вместо CapsLock.
  • Поменять Ctrl/Win/Alt на Win/Alt/Ctrl слева и Alt/PrintScreen/Ctrl на Ctrl/Alt/Ctrl справа.
  • Поменять переключение приложений с Alt+Tab на Ctrl+Tab.
  • Скриншот на Ctrl+Shift+3.
  • Переключение языков по Win+Space.
  • Поддержка английской и русской раскладок.

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



Т.к. мои вкусы весьма специфичны (Ты же хочешь Ctrl вместо CapsLock, мой дорогой любитель Vim?), а раскладки неизменяемы "на лету", я не предоставляю готовый apk-файл. Вместо этого создан — проект основа для кастомизации раскладки внешней клавиатуры на Android.


Клонируем проект к себе


git clone [email protected]:ris58h/custom-keyboard-layout.git


Манифест приложения app/src/main/AndroidManifest.xml:














Приложение состоит из одного reciever. Забавно, что само наличие класса с заданным именем (в нашем случае InputDeviceReceiver) не требуется — всё работает и без него, но имя мы задать обязаны. Этот reciever предоставляет список клавиатурных раскладок, хранящийся в app/src/main/res/xml/keyboard_layouts.xml:







В списке только одна раскладка — keyboard_layout_en_us.

Кастомизация файла раскладки



Файл раскладки app/src/main/res/raw/keyboard_layout_en_us.kcm состоит из одной строки, задающей тип раскладки:


type OVERLAY


Про этот тип ничего не сказано в , но опытным путём выяснено, что раскладка с таким типом по-умолчанию берёт значения из . Т.е. мы уже получили английскую раскладку и всё что остаётся — это добавить наши правила.


Но сперва небольшое отступление про Key Layout файлы. Раскладки задаётся как kcm-файл, но для того чтобы поменять местами, например, Ctrl и Alt необходим kl-файл. Тут на помощь приходит ещё одна незадокументированная фича: с помощью команды map можно добавлять правила из kl-файла в kcm-файл.


Файл keyboard_layout_en_us.kcm с моими правилами:


type OVERLAY

map key 58 ESCAPE

map key 29 META_LEFT
map key 56 CTRL_LEFT
map key 125 ALT_LEFT

map key 99 ALT_RIGHT
map key 100 CTRL_RIGHT

key TAB {
label: '\t'
base: '\t'
ctrl: fallback APP_SWITCH
}

key 3 {
label: '3'
base: '3'
shift: '#'
ctrl+shift: fallback SYSRQ
}


К сожалению, у меня не получилось задать переключение языков по Win+Space — такое правило просто не срабатывало.

Добавляем раскладку с другим языком



Для добавления раскладки другого языка, отличного от English(US), нужно сперва составить kcm-файл с раскладкой этого языка, затем добавить к нему наши правила. Взять готовый файл для своего языка можно . Берём , кладём в app/src/main/res/raw/ и, соответственно, добавляем ещё одну раскладку в app/src/main/res/xml/keyboard_layouts.xml:








Не забываем добавить keyboard_layout_ru_label в app/src/main/res/values/strings.xml.
Теперь можно добавить наши правила, как в примере с английской раскладкой, но с небольшим изменением. В русской раскладке уже есть правило для '3', поэтому нужно лишь изменить его, а не добавлять новое:


key 3 {
label: '3'
base: '3'
shift: '\u2116'
ralt: '#'
ctrl+shift: fallback SYSRQ
}


Состояние проекта после этой кастомизации можно посмотреть в ветке .

Установка



Собираем и устанавливаем наше приложение. Проще всего это сделать с помощью следуя .


Если всё сделано правильно, то в Settings -> Language & input -> Physical keyboard появятся наши раскладки, а в списке приложений — Custom Keyboard Layout.

Заключение



Кастомизация внешней клавиатуры без root возможна. Не все хотелки при этом достижимы: переключение языков по Win+Space так и не заработало, но это может быть проблемой прошивки.
Статья нарочно сделана краткой — все подробности можно найти по ссылкам.
 
Сверху Снизу