[Android调试基础四]键盘输入调试(输入监听与模拟发送)

来源:互联网 发布:服务器坏了数据怎么办 编辑:程序博客网 时间:2024/05/18 08:47

  键盘输入转换原理:

  当有按键响应时,USB HID UsageID经过驱动转换为扫描的键值Scancodeandroidscancode经配置表(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的转换关系如下:



附录:

  1. # getevent -h  
  2. Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-p] [-q] [-c count] [-r] [device]  
  3.     -t: show time stamps  
  4.     -n: don't print newlines  
  5.     -s: print switch states for given bits  
  6.     -S: print all switch states  
  7.     -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32)  
  8.     -p: show possible events (errs, dev, name, pos. events)  
  9.     -q: quiet (clear verbosity mask)  
  10.     -c: print given number of events then exit  
  11.     -r: print rate events are received  
其中 [-t] 参数显示事件的时间戳,[-n] 取消事件显示时的换行符,[-s switchmask] 得到指定位的开关状态,[-S] 得到所有开关的状态,[-v [mask]] 根据mask的值显示相关信息,后面详细介绍mask的使用方法,[-p] 显示每个设备支持的事件类型和编码,[-q] 只显示事件数据,[-c count] 只显示count次事件的数据,[-r] 显示事件接收频率。下面看一下命令以及相关参数的使用结果:




原创粉丝点击