转自:http://xiaoxia.de/2011/06/change-key-layout-on-android/
framework/base/libs/ui/input.cpp 中有定义
static const char* CONFIGURATION_FILE_DIR[] = {
"idc/",
"keylayout/",
"keychars/",
};
static const char* CONFIGURATION_FILE_EXTENSION[] = {
".idc",
".kl",
".kcm",
};
其实此文是一年之前应一个 Milestone 机友的求助(返回键失灵,希望用搜索键替代返回键)而写的,后来又发到了论坛上,现在拿来就是为了充充门面,让本博客显得有点牛逼的样子。
此文是以 Milestone(XT702)为参照所写,其原理适用于大部分基于 Android 的设备(包含但不限于手机),但是又因 Android 设备的高度定制性,此方法不可能完全适用于所有 Android 设备,映射值需要参考对应设备的映射表,不能混用。
Android 使用标准的 Linux 输入事件设备/dev/input/,驱动按键定义在 Linux 内核/include/linux/input.h中,但是 Android 系统没有直接使用映射后的值,而是对其再进行了一次映射。从内核标准键值到 Android 所用的键值映射表定义在 Android 文件系统的/system/usr/keylayout目录下。Android 标准的键值映射表文件为 qwerty.kl,定义如下:
| KEY | 键值 ID | 映射值 | Flag |
| key | 1 | BACK | WAKE_DROPPED |
| 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 | 13 | EQUALS | |
| 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 | 26 | LEFT_BRACKET | |
| key | 27 | RIGHT_BRACKET | |
| key | 28 | ENTER | |
| 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 | 40 | APOSTROPHE | |
| key | 42 | SHIFT_LEFT | |
| key | 43 | BACKSLASH | |
| 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 | 54 | SHIFT_RIGHT | |
| key | 56 | ALT_LEFT | |
| key | 57 | SPACE | |
| key | 59 | MENU | WAKE_DROPPED |
| key | 60 | SOFT_RIGHT | WAKE |
| key | 61 | CALL | WAKE_DROPPED |
| key | 62 | ENDCALL | WAKE_DROPPED |
| key | 100 | ALT_RIGHT | |
| key | 102 | HOME | WAKE |
| key | 103 | DPAD_UP | WAKE_DROPPED |
| key | 105 | DPAD_LEFT | WAKE_DROPPED |
| key | 106 | DPAD_RIGHT | WAKE_DROPPED |
| key | 107 | ENDCALL | WAKE_DROPPED |
| key | 108 | DPAD_DOWN | WAKE_DROPPED |
| key | 114 | VOLUME_DOWN | |
| key | 115 | VOLUME_UP | |
| key | 116 | POWER | WAKE |
| key | 127 | SEARCH | WAKE_DROPPED |
| key | 139 | MENU | WAKE_DROPPED |
| key | 150 | EXPLORER | |
| key | 155 | ENVELOPE | |
| key | 158 | BACK | WAKE_DROPPED |
| key | 212 | CAMERA | |
| key | 215 | AT | |
| key | 217 | SEARCH | WAKE_DROPPED |
| key | 227 | STAR | |
| key | 228 | POUND | |
| key | 229 | MENU | WAKE_DROPPED |
| key | 230 | SOFT_RIGHT | WAKE |
| key | 231 | CALL | WAKE_DROPPED |
| key | 232 | DPAD_CENTER | WAKE_DROPPED |
|
key
| 399 | GRAVE |
很明显,这是依照标准 QWERTY 电脑键盘从左至右从上到下的顺序排列的。
*映射值:
即相应键值的英文名称,具体含义搜索一下便知。注意需要全部使用大写。
*Flag:
SHIFT:按下时,自动加上 SHIFT 键值。
ALT:按下时,自动加上 ALT 键值。
CAPS:按下时,自动带上 CAPS 大写。
WAKE:按下时,当设备进入睡眠的时候,按下这个键将唤醒,并且发送消息给应用层。
WAKE_DROPPED:按下时,且设备正处于睡眠,设备被唤醒,但是不发送消息给应用层。
只要打开qwerty.kl,将其中对应的 Key 的 ID 后面的键值改为需要的键值即可。再用 root explorer 等具有系统文件操作功能的文件管理器把qwerty.kl移动到根目录的/system/usr/keylayout/里覆盖同名文件即可。(电脑端建议使用 notepad++ 等文本编辑器打开qwerty.kl文件)
例如:用搜索键替代返回键:
key 127 SEARCH WAKE_DROPPED
key 217 SEARCH WAKE_DROPPED
参看上面的键值映射表可以知道返回键的键值定义为 BACK。 然后需要将qwerty.kl中的对应位置改成
key 127 BACK WAKE_DROPPED
key 217 BACK WAKE_DROPPED
将该文件回拷到手机上时最好先放到手机内非/sdcard/的目录,修改好相应的权限(CHMOD 644以上)之后再拷入/system/usr/keylayout/,然后重启即可。
为了安全起见,在操作之前最好对手机进行 nandroid 备份。
参考这种方法,基本可以实现将任意键修改为你所需要的功能。
本文详细介绍了如何在Android设备上更改按键映射,通过修改系统文件qwerty.kl来实现按键功能的替换,如用搜索键代替返回键。
2万+

被折叠的 条评论
为什么被折叠?



