键盘输入转换原理:
当有按键响应时,USB HID UsageID经过驱动转换为扫描的键值Scancode,android将scancode经配置表(如qwerty.kl)找到keycodelabel,然后由内部表KEYCODES列表找到keycode的数字值,再由keycode的数字值经字符配置表(如qwerty.kcm)找到对应的字符值。
调试方法:
<一> 输入监听
adb shell->使用getevent命令来获取输入设备,并获取输入相应的信息。可以输入getevent -h来查找该命令的用法,
常用如下:
getevent ->监听event
getevent -i -> 打印具体的输入设备信息与键值等。
getevent /dev/input/eventX ->只查看具体event的输入键值
<二> 模拟输入
adb shell ->使用sendevnet命令可以模拟输入设备给eventX发送scancode,模拟按键输入。
如:sendevent /dev/input/eventX 1 116 1 ==>模拟按下开关机键
sendevent /dev/input/eventX 1 116 0 ==>模拟释放开关机键
以上在调试手机平台上ok,但是box上不能响应。因此使用getevent获取某按键按下时的触发事件,发现其发了6个事件,如下:
因此模拟该事件,系统正常响应。
如下:(此时功能为音量减,没有发送释放按键代码,发送后面两个信号事件,即在原来的基础上发送同步信号。只是把1 114 1->1 114 0)
模拟按键是使用sendevent是发送scancode,发送较麻烦,另一种方法是发送keycode的方式,也就是最终的数值来传送,如Home的HID键值为usageID=0x0223,tyep=0xc;转到Linux下的Linux key code在Android上就是scancode,该值为172(0xac),而Android key code的值为0x0003,该值就是Scancode对应的字符经过KEYCODES转换后的值。我们可以使用input keyevent指令测试,如:input keyevent 3 //Home。其中(Android)keycode的转换关系如下:
附录:
- # getevent -h
- Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-p] [-q] [-c count] [-r] [device]
- -t: show time stamps
- -n: don't print newlines
- -s: print switch states for given bits
- -S: print all switch states
- -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32)
- -p: show possible events (errs, dev, name, pos. events)
- -q: quiet (clear verbosity mask)
- -c: print given number of events then exit
- -r: print rate events are received