在android系统中增加物理按键或者红外遥控功能的思路

以红外遥控为例:

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/8606856

http://blog.csdn.net/xzongyuan/article/details/30226995




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值