以红外遥控为例:
1.通过adb shell进入开发板的系统。
2.在路径/dev/input/下可以看到uevent。然后用getevent可以列出所有的设备,还有每个event对应什么设备的信息。然后,我动了动鼠标,就打印出了很多event3的信息。
其中/dev/input/event3是device的名字, 0001是type, 001e是键码, 最后一个根据type不同而不同。
这样,当我们按下按键,就可以捕捉到键码。
还可以参照如下链接:http://blog.csdn.net/lichaoandy/article/details/6565893
C:\Documents and Settings\Administrator>adb shell
root@android:/ # cd dev/input
cd dev/input
root@android:/dev/input # ls
ls
event0
event1
event2
event3
root@android:/dev/input # getevent
getevent
add device 1: /dev/input/event3
name: "Logitech USB Receiver"
add device 2: /dev/input/event2
name: "Logitech USB Receiver"
add device 3: /dev/input/event0
name: "rk29-keypad"
add device 4: /dev/input/event1
name: "rkxx-remotectl"
/dev/input/event3: 0002 0000 ffffffff
/dev/input/event3: 0002 0001 fffffffe
/dev/input/event3: 0000 0000 00000000
/dev/input/event3: 0002 0000 ffffffff
/dev/input/event3: 0002 0001 fffffffd
/dev/input/event3: 0000 0000 00000000
/dev/input/event3: 0002 0001 fffffffe
/dev/input/event3: 0000 0000 00000000
/dev/input/event3: 0002 0001 ffffffff
/dev/input/event3: 0000 0000 00000000
/dev/input/event3: 0002 0000 00000001
/dev/input/event3: 0000 0000 00000000
/dev/input/event3: 0002 0001 ffffffff
/dev/input/event3: 0000 0000 00000000
/dev/input/event3: 0002 0000 00000001
/dev/input/event3: 0000 0000 00000000
/dev/input/event3: 0002 0000 ffffffff
/dev/input/event3: 0000 0000 00000000
/dev/input/event3: 0002 0000 ffffffff
3.不同遥控器会有不同的键码,然后需要在linux底层做键码映射。统一映射为linux层的键码。(硬件键码 to linux层键码)。linux层的键码是在input.h定义好的,定义好什么数字对应什么功能,有的还没定义,可以在预留的数字增加功能。
附录:input.h 中定义的键值
#define KEY_RESERVED 0
#define KEY_ESC 1
#define KEY_1 2
#define KEY_2 3
#define KEY_3 4
#define KEY_4 5
#define KEY_5 6
#define KEY_6 7
#define KEY_7 8
#define KEY_8 9
#define KEY_9 10
#define KEY_0 11
#define KEY_MINUS 12
#define KEY_EQUAL 13
#define KEY_BACKSPACE 14
#define KEY_TAB 15
#define KEY_Q 16 。。。。。。。。。
这个映射,其实是在某个厂商定义的.c文件中,用数组表示的,由于input.h中的定义是递增的,所以可以用数组+偏移量的办法定义。
例如,在 kernel 代码的/drivers/hid/hid-input.c 中有一个键盘映射的数组,总共定义了 256 个,如下所示。与key和红外设备不同的是,hid设备还经过了一层映射。
static const unsigned char hid_keyboard[256] = {
0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38,
50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3,
4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26,
27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64,
65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106,
105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71,
72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190,
191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113,
115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk,
122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,unk,unk,unk,unk,
unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113,
150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk
};
4.这一步之后,需要把linux键码做第二次转码,转为android层的键码,android源码中,有以kl为后缀的文件专门做了这个工作。这个文件可以在/device路径下找。
文件内容如下:
key 28 ENTER
key 116 POWER WAKE
key 158 BACK
key 139 MENU
key 217 SEARCH
key 232 DPAD_CENTER
key 108 DPAD_DOWN
key 103 DPAD_UP
key 102 HOME
key 105 DPAD_LEFT
第二列是linux键码,第三列是android层键码。
实体按键可以找这个文件qwerty.kl 。
5.剩下的就是android上层的配置。需要修改如下文件
KeycodeLabels.h/attrs.xml/KeyEvent.java
首先是KeycodeLabel.h,映射到应用层
frameworks/base/include/ui/KeycodeLabels.h
static const KeycodeLabel KEYCODES[] = {
//按键名, 键值
{ "SOFT_LEFT", 1 },
{ "SOFT_RIGHT", 2 },
{ "HOME", 3 },
{ "BACK", 4 },
{ "CALL", 5 },
.........
}
6.接着修改framework层的res文件,把键值1,2....添加到全局资源中,这样,所有app应用都能识别这个键值了。
frameworks/base/core/res/res/values/attrs.xml
<!-- This enum provides the same keycode values as can be found in
{@link android.view.KeyEvent}. -->
<attr name="keycode">
<!-- 按键名 键值-->
<enum name="KEYCODE_UNKNOWN" value="0" />
<enum name="KEYCODE_SOFT_LEFT" value="1" />
<enum name="KEYCODE_SOFT_RIGHT" value="2" />
<enum name="KEYCODE_HOME" value="3" />
<enum name="KEYCODE_BACK" value="4" />
.........
7.添加应用程序全局变量到按键键值映射,映射的信息同上,但这里的文件是KeyEvent,是KeyEvent.getKeyCode的直接实现部分。我还不清楚与6的区别,待后续查看源码。
frameworks/base/core/java/android/view/KeyEvent.java
public static final int KEYCODE_HOME
/** Key code constant: Back key. */
public static final int KEYCODE_BACK= 3;
/** Key code constant: Call key. */
public static final int KEYCODE_CALL= 4;
/** Key code constant: End Call key. */
public static final int KEYCODE_ENDCALL= 5;
配置到这里,就可以通过Keyevent.getKeyCode()获取新添加按键的键值。
更多的可以参考:
http://blog.csdn.net/lsdmx2016/article/details/8606856http://blog.csdn.net/xzongyuan/article/details/30226995