Приветствую, хабралюди!
На ДР, мне друзья подарили BT-клавиатуру. Маленькая, беленькая, симпатичная, Удобная!
Подключил ее к своему Android 2.3.5 (SGSII), стал с ее помощью лазить по меню, запускать программы, дошел до Вконтакте и решил написать сообщение… а вот переключить на русский язык не смог, но как оказалось позже, это еще были только цветочки! Но кое-что мне удалось. Интересно как?
Сейчас я уже многое понял, и не знаю с чего начать свой рассказ. Поэтому будет долго и скучно, но игра стоит свеч!
Клавиатура RAPOO E6300
Андроидофон Samsung Galaxy S II
Начал я с того, что написал письмо в техподдержку клавиатуры, с вопросом: а не могли бы вы посодействовать с настройкой клавиатуры для Андроида? Получил, как и ожидалось, ласковый отказ: «Эта клавиатура сделана специально для iPad».
Пока ждал от них ответа, стал «прогугливать» тему взаимодействия HID устройств и Android. И среди массы хлама нашел две полезнейшие статьи:
Изучение этих статей дало понимание, что для правильной работы устройства, нужно отредактировать как минимум .kl-файл, содержащий назначения клавиш.
Кому лень было читать статьи, кратко поясню:
На Вашем Android устройстве есть папка (кстати зависит от устройства, подробности есть в статье выше)
где расположены нужные нам каталоги
в них размещаются файлы типа
Первый (обычный текстовый) отвечает за соответствие сигналов клавиатуры (Linux key code) сигналам Android (Android key code name) и выглядит как список из таких команд:
Расшифровка:
По-русски: если на клавиатуре нажали кнопку с кодом 30, то системе будет послана клавиша А, при этом устройство проснется.
Флаг WAKE заставляет устройство проснуться и отреагировать на нажатие буквой А.
А флаг WAKE_DROPPED заставляет только проснуться, т.е. чтобы нажать А, надо будет нажать ее снова.
В статье есть описание и других флагов.
Второй (скомпилированный из исходника бинарник) отвечает за комбинации клавиш вместе с Shift, Alt и т.п. Здесь уже идет таблица из разных вариантов, описывающих действия над Android key. В исходном виде он выглядит как:
А скомпилирован он для ускорения работы и загрузки устройства.
Я написал в техподдержку клавиатуры снова, описав свои наблюдения. Но поддержки от них никакой не добился. Им это не интересно. Придется все делать самому.
Для доступа в папку /system нужны права root. Значит нужно его получить и не потерять гарантию. Я долго искал способ и для себя один нашел. Ничего не нужно прошивать. Все можно вернуть назад. ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК! ВСЕ ТОЛЬКО ДЛЯ ОЗНАКОМЛЕНИЯ! НИКАКОЙ ОТВЕТСТВЕННОСТИ! Но для меня все сработало как надо.
Чтобы туда что-то положить, нужно подготовить наш файл имя_клавиатуры.kl. И начать стоит с того, чтобы скачать исходный образец. В папку /system/usr/keylayout/ можно попасть и без root, скопировав оттуда нужный нам файл при помощи файлового менеджера. Я воспользовался ASTRO. Но можно воспользоваться консольным приложением adb.exe, поставляемом с Samsung KIES.
Команда
Ну вот, нашли файл, скачали, сделали копию, открыли текстовым редактором типа notepad.
У меня файл назывался Broadcom_Bluetooth_HID.kl
Все понятно, какие-то коды, какие-то кнопки, что к чему не особо понятно, но мы уже готовы к этому, потому что внимательно читали эту статью с начала и до сюда. А как же определить коды клавиш?
Я «отксерил» свою клавиатуру на копире и ручкой стал подписывать коды, которые мне давала программа KeyEvent Display. Так я получил набор кодов, осталось переписать их в файл и назначить им правильные функции.
Открываем первую статью по клавиатурам и методично назначаем новые значения нашим кнопкам.
Получается что-то вроде этого:
Поэтому, для будущей совместимости, я в своем файле, клавиши предназначенные не для моей версии Android OS, перенес в конец. Как показала практика, в этом случае все работает и файл готов к переносу на другие версии ОС.
Здесь не обойтись без консольной утилиты. Подключаем девайс по USB в режиме отладки и выполняем последовательно команды в консоли cmd.exe:
D:\android-sdks\platform-tools — это папка, в которой у меня находится adb.exe из SDK (у кого установлен только KIES — ищите в Program Files)
adb push Broadcom_Bluetooth_HID.kl... — это команда закачивает файл в папку. Папка /data/local/ выбрана не случайно. Это одна из немногих папок, в которую можно что-то положить, и из которой можно скопировать файл в другую файловую систему.
mount -o remount,rw -t ext4 /dev/block/mmcblk0p9 /system — перемонтирование системы. В интернете полно примеров как это делать, но там почему-то указаны совсем не те диски и файловая система. Пришлось подкорректировать.
остальное — удаление старого, копирование нашего файла и назначение ему правильных прав. Назначение прав очень важно!
Теперь нужно отсоединить USB (из-за него иногда выключается Bluetooth) и перезапустить соединение с клавиатурой:
Поздравляю! По-другому и быть не могло! Вы молодец! Только… как же на русский-то перейти?
Не долго гугля, я нашел простой ответ — нужна софтварная клавиатура, поддерживающая аппаратную. Таких немного. Идеальная, на мой взглад, на сегодня — ruKeybord
Устанавливаем, настраиваем, в раскладках устанавливаем аппаратную клавиатуру вместо qwerty и т.п.
Теперь можно переключать раскладку через Alt+Shift (UPD: или Shift+Space). И флажок показывается.
Кто еще не в курсе, чтобы быстро переключаться между клавиатурами, подержите палец на любом поле ввода и выберите из выпавшего меню «Режим ввода».
Как ни старался, но заставить заработать все кнопки, подобно компьютеру, на 2.3.5 невозможно. Но скоро я обновлюсь до Android OS 4 и новые кнопки заработают. На первой фотографии я сижу в putty и редактирую сайт. Очень не хватает кнопки Ctrl. Очень жду обновления ОС. Доволен результатом.
Спасибо за внимание!
На ДР, мне друзья подарили BT-клавиатуру. Маленькая, беленькая, симпатичная, Удобная!
Подключил ее к своему Android 2.3.5 (SGSII), стал с ее помощью лазить по меню, запускать программы, дошел до Вконтакте и решил написать сообщение… а вот переключить на русский язык не смог, но как оказалось позже, это еще были только цветочки! Но кое-что мне удалось. Интересно как?
Сейчас я уже многое понял, и не знаю с чего начать свой рассказ. Поэтому будет долго и скучно, но игра стоит свеч!
Имеем:
Клавиатура RAPOO E6300
Андроидофон Samsung Galaxy S II
Первые шаги
Начал я с того, что написал письмо в техподдержку клавиатуры, с вопросом: а не могли бы вы посодействовать с настройкой клавиатуры для Андроида? Получил, как и ожидалось, ласковый отказ: «Эта клавиатура сделана специально для iPad».
Пока ждал от них ответа, стал «прогугливать» тему взаимодействия HID устройств и Android. И среди массы хлама нашел две полезнейшие статьи:
Изучение этих статей дало понимание, что для правильной работы устройства, нужно отредактировать как минимум .kl-файл, содержащий назначения клавиш.
Кому лень было читать статьи, кратко поясню:
На Вашем Android устройстве есть папка (кстати зависит от устройства, подробности есть в статье выше)
/system/usr
где расположены нужные нам каталоги
keylayout
и keychars
в них размещаются файлы типа
имя_клавиатуры.kl
и имя_клавиатуры.kcm.bin
соответственно.Первый (обычный текстовый) отвечает за соответствие сигналов клавиатуры (Linux key code) сигналам Android (Android key code name) и выглядит как список из таких команд:
key 30 A WAKE
Расшифровка:
key [scancode] [Android key] [Flags]
По-русски: если на клавиатуре нажали кнопку с кодом 30, то системе будет послана клавиша А, при этом устройство проснется.
Флаг WAKE заставляет устройство проснуться и отреагировать на нажатие буквой А.
А флаг WAKE_DROPPED заставляет только проснуться, т.е. чтобы нажать А, надо будет нажать ее снова.
В статье есть описание и других флагов.
Второй (скомпилированный из исходника бинарник) отвечает за комбинации клавиш вместе с Shift, Alt и т.п. Здесь уже идет таблица из разных вариантов, описывающих действия над Android key. В исходном виде он выглядит как:
key A {
label: 'A'
base: 'a'
shift, capslock: 'A'
ctrl, alt, meta: none
}
А скомпилирован он для ускорения работы и загрузки устройства.
Решаем что делать
Я написал в техподдержку клавиатуры снова, описав свои наблюдения. Но поддержки от них никакой не добился. Им это не интересно. Придется все делать самому.
Что, опять нужен root?
Для доступа в папку /system нужны права root. Значит нужно его получить и не потерять гарантию. Я долго искал способ и для себя один нашел. Ничего не нужно прошивать. Все можно вернуть назад. ИСПОЛЬЗУЙТЕ НА СВОЙ СТРАХ И РИСК! ВСЕ ТОЛЬКО ДЛЯ ОЗНАКОМЛЕНИЯ! НИКАКОЙ ОТВЕТСТВЕННОСТИ! Но для меня все сработало как надо.
Готовим файл
Чтобы туда что-то положить, нужно подготовить наш файл имя_клавиатуры.kl. И начать стоит с того, чтобы скачать исходный образец. В папку /system/usr/keylayout/ можно попасть и без root, скопировав оттуда нужный нам файл при помощи файлового менеджера. Я воспользовался ASTRO. Но можно воспользоваться консольным приложением adb.exe, поставляемом с Samsung KIES.
Команда
adb pull remote local
- copy file/dir from device
Первые грабли:
Определить имя нужного файла может быть затруднительно. Общий принцип названия файлов, согласно статье — Vendor_XXXX_Product_XXXX_Version_XXXX.kl или DEVICE_NAME.kl
Ну вот, нашли файл, скачали, сделали копию, открыли текстовым редактором типа notepad.
У меня файл назывался Broadcom_Bluetooth_HID.kl
Тааааак, и что тут у нас?
Все понятно, какие-то коды, какие-то кнопки, что к чему не особо понятно, но мы уже готовы к этому, потому что внимательно читали эту статью с начала и до сюда. А как же определить коды клавиш?
Вторые грабли:Просто заходим на маркет и находим то что нужно, не с первой попытки конечно. Я перепробовал 3-4 программы. Не все могли похвастаться нужной функцией — многие отображали только Android коды, которые уже прописаны в нашем файле. А нам нужны scancod'ы!
Чтобы определить коды клавиш понадобится средство отладки или...
Получаем scancod'ы
Я «отксерил» свою клавиатуру на копире и ручкой стал подписывать коды, которые мне давала программа KeyEvent Display. Так я получил набор кодов, осталось переписать их в файл и назначить им правильные функции.
Редактируем файл
Открываем первую статью по клавиатурам и методично назначаем новые значения нашим кнопкам.
Получается что-то вроде этого:
# RAPOO E6300 keylayout file
# (c) Nix Pro Soft - Nikita Tratorov, 2012
key 172 HOME WAKE_DROPPED
key 217 SEARCH WAKE_DROPPED
key 165 MEDIA_PREVIOUS
key 164 MEDIA_PLAY_PAUSE
key 163 MEDIA_NEXT
key 114 VOLUME_DOWN
key 115 VOLUME_UP
key 1 BACK WAKE_DROPPED
# key 183
key 41 GRAVE
key 2 1
key 3 2
key 4 3
key 5 4
key 6 5
key 7 6
key 8 7
key 9 8
key 10 9
key 11 0
key 12 MINUS
key 14 DEL
key 15 TAB
key 16 Q
key 17 W
key 18 E
key 19 R
key 20 T
key 21 Y
key 22 U
key 23 I
key 24 O
key 25 P
key 13 EQUALS
key 43 BACKSLASH
key 58 SHIFT_LEFT
key 30 A
key 31 S
key 32 D
key 33 F
key 34 G
key 35 H
key 36 J
key 37 K
key 38 L
key 39 SEMICOLON
key 28 ENTER WAKE_DROPPED
key 42 SHIFT_LEFT
key 86 GRAVE
key 44 Z
key 45 X
key 46 C
key 47 V
key 48 B
key 49 N
key 50 M
key 51 COMMA
key 52 PERIOD
key 53 SLASH
key 103 DPAD_UP
key 54 SHIFT_RIGHT
key 56 ALT_LEFT
# key 125
# key 161
key 57 SPACE WAKE_DROPPED
# key 126
key 26 LEFT_BRACKET
key 27 RIGHT_BRACKET
key 40 APOSTROPHE
key 105 DPAD_LEFT
key 108 DPAD_DOWN
key 106 DPAD_RIGHT
# keys for Android >=3.0
key 113 VOLUME_MUTE
key 111 FORWARD_DEL
key 1 ESCAPE WAKE_DROPPED
key 59 F1
key 60 F2
key 61 F3
key 62 F4
key 63 F5
key 64 F6
key 65 F7
key 66 F8
key 67 F9
key 68 F10
key 87 F11
key 88 F12
key 58 CAPS_LOCK
key 29 CTRL_LEFT
key 104 PAGE_UP
key 93 PAGE_DOWN
Третьи грабли:Все кнопки, указанные после неправильной не будут функционировать.
Не все кнопки будут работать с Вашей версией Android OS! Обратите внимание на колонку Version в первой статье про клавиатуры. Если вы используете те коду, которые предназначены для версий больше вашей, тогда с этого места клавиатура не будет работать.
Поэтому, для будущей совместимости, я в своем файле, клавиши предназначенные не для моей версии Android OS, перенес в конец. Как показала практика, в этом случае все работает и файл готов к переносу на другие версии ОС.
Закидываем файл в систему
Здесь не обойтись без консольной утилиты. Подключаем девайс по USB в режиме отладки и выполняем последовательно команды в консоли cmd.exe:
d:
cd D:\android-sdks\platform-tools
adb push Broadcom_Bluetooth_HID.kl /data/local/Broadcom_Bluetooth_HID.kl
adb shell
su
mount -o remount,rw -t ext4 /dev/block/mmcblk0p9 /system
rm /system/usr/keylayout/Broadcom_Bluetooth_HID.kl
cp /data/local/Broadcom_Bluetooth_HID.kl /system/usr/keylayout/Broadcom_Bluetooth_HID.kl
chmod 644 /system/usr/keylayout/Broadcom_Bluetooth_HID.kl
exit
exit
Четвертые грабли:После перезагрузки устройства, файловая система снова станет «только для чтения».
Папка /system находится на файловой системе в режиме только для чтения. Для того, чтобы туда писать, нужно перемонтировать систему в режиме RW. Но для этого, нужно определить точку монтирования и тип файловой системы при помощи простой команды mount.
Пояснения к командам:
D:\android-sdks\platform-tools — это папка, в которой у меня находится adb.exe из SDK (у кого установлен только KIES — ищите в Program Files)
adb push Broadcom_Bluetooth_HID.kl... — это команда закачивает файл в папку. Папка /data/local/ выбрана не случайно. Это одна из немногих папок, в которую можно что-то положить, и из которой можно скопировать файл в другую файловую систему.
mount -o remount,rw -t ext4 /dev/block/mmcblk0p9 /system — перемонтирование системы. В интернете полно примеров как это делать, но там почему-то указаны совсем не те диски и файловая система. Пришлось подкорректировать.
остальное — удаление старого, копирование нашего файла и назначение ему правильных прав. Назначение прав очень важно!
Проверяем
Теперь нужно отсоединить USB (из-за него иногда выключается Bluetooth) и перезапустить соединение с клавиатурой:
- Если клавиатура не хочет подсоединяться — значит вы забыли установить права, неправильно заполнили файл или положили файл не в ту папку (повторюсь, у каждого устройства они разнятся, читайте первую статью). В общем что-то с файлом.
- Если клавиатура подключилась, но половина клавиш не работает, значит с того места, где она не работает, вы вставили неподдерживаемый вашей версией код. Переместите его в конец файла.
Заработало!
Поздравляю! По-другому и быть не могло! Вы молодец! Только… как же на русский-то перейти?
Не долго гугля, я нашел простой ответ — нужна софтварная клавиатура, поддерживающая аппаратную. Таких немного. Идеальная, на мой взглад, на сегодня — ruKeybord
Устанавливаем, настраиваем, в раскладках устанавливаем аппаратную клавиатуру вместо qwerty и т.п.
Теперь можно переключать раскладку через Alt+Shift (UPD: или Shift+Space). И флажок показывается.
Кто еще не в курсе, чтобы быстро переключаться между клавиатурами, подержите палец на любом поле ввода и выберите из выпавшего меню «Режим ввода».
Итоги
Как ни старался, но заставить заработать все кнопки, подобно компьютеру, на 2.3.5 невозможно. Но скоро я обновлюсь до Android OS 4 и новые кнопки заработают. На первой фотографии я сижу в putty и редактирую сайт. Очень не хватает кнопки Ctrl. Очень жду обновления ОС. Доволен результатом.
Done!
Спасибо за внимание!