Android getevent/senevent



getevent 程序会扫描/dev/input 目录下的所有文件,依次打开该目录底下的所有驱动。

getevnet -i
该命令会罗列出该目录底下驱动设备的所有信息。


以下转自:http://blog.csdn.net/lichaoandy/article/details/6565893


getevent&sendevent 是android系统下的一个工具,可以模拟多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的gesture事件。

 

=== getevent ===

getevent 监控当前的事件,鼠标事件,按键事件,拖动滑动等

 

dd device 1: /dev/input/event0
  name: "qwerty2"
/dev/input/event0: 0001 001e 00000001
/dev/input/event0: 0001 001e 00000000

其中/dev/input/event0是device的名字 0001是type, 001e是键码, 最后一个根据type不同而不同
比如上面的倒数第二条就是按下a键的keydown,最后一个是按下a的keyup
具体的type,code,value的定义可以在源码/frameworks/base/core/java/android/view/KeyEvent.java中找到

=== sendevent ===

 

命令格式2:adb shell sendevent [device] [type] [code] [value]

 

发送时间,格式和上面的一样,需要注意的是在get中code显示的是十六进制,而send中需要用十进制,例如

# sendevent /dev/input/event0 1 5 1
这个命令就是发送数字4的keydown消息,所以在屏幕上就会一直打印出很多个4(因为没有发送keyup)

 

如: adb shell sendevent /dev/input/event0 1 229 1 代表按下按下menu键

adb shell sendevent /dev/input/event0 1 229 0 代表按下松开menu键

说明:上述的命令需组合使用

另外所知道的命令如下:

Key Name                        CODE

MENU                                 229

HOME                                 102

BACK (back button)            158

CALL (call button)               231

END (end call button)         107

2. 发送鼠标事件(Touch):

命令格式:adb shell sendevent [device] [type] [code] [value]

情况1:在某坐标点上touch

如在屏幕的x坐标为40,y坐标为210的点上touch一下,命令如下

adb shell sendevent /dev/input/event0 3 0 40
adb shell sendevent /dev/input/event0 3 1 210
   
adb shell sendevent /dev/input/event0 1 330 1 //touch
adb shell sendevent /dev/input/event0 0 0 0       //it must have
   
adb shell sendevent /dev/input/event0 1 330 0 //untouch
adb shell sendevent /dev/input/event0 0 0 0 //it must have

注:以上六组命令必须配合使用,缺一不可

情况2:模拟滑动轨迹(可下载并采用aPaint软件进行试验)

如下例是在aPaint软件上画出一条开始于(100,200),止于(108,200)的水平直线

adb shell sendevent /dev/input/event0 3 0 100 //start from point (100,200)
adb shell sendevent /dev/input/event0 3 1 200
   
adb shell sendevent /dev/input/event0 1 330 1 //touch
adb shell sendevent /dev/input/event0 0 0 0
   
adb shell sendevent /dev/input/event0 3 0 101 //step to point (101,200)
adb shell sendevent /dev/input/event0 0 0 0
……………………                                                  //must list each step, here just skip
adb shell sendevent /dev/input/event0 3 0 108 //end point(108,200)
adb shell sendevent /dev/input/event0 0 0 0
   
adb shell sendevent /dev/input/event0 1 330 0 //untouch
adb shell sendevent /dev/input/event0 0 0 0

 

参考:

http://topic.csdn.net/u/20100326/17/1f0fc5a1-3bd2-4294-aa35-1bcb73357aa3.html

http://www.51testing.com/html/65/n-215865-2.html



---------------------------------------------------------------------------------------------------------------------------------------

转自:http://www.ddjava.com/blog/blog.html?blogId=612

原创:  android测试之getevent/sendevent
博客分类: androi&jni  
标签: android;getevent/sendevent;input 
关于在android平台上捕获事件的资料互联网上已经铺天盖地,但个人觉得可用性都不太大,大部仅 

针对特定设备,而对于其他设备引导性不强,故整理处本文,望对初学者有个有力的帮助: 

getevent 旨在获取android设备的事件信息,具体参考详细用法(本人亦初学者一枚,无法深入解释) 
sendevent 则可以向设备发送模拟事件,其中包括touch和keypress 

详细用法如下: 
源码 复制 打印 ?
  1. Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-q] [-c count] [-r] [device]  
  2.     -t: show time stamps  
  3.     -n: don't print newlines  
  4.     -s: print switch states for given bits  
  5.     -S: print all switch states  
  6.     -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)  
  7.     -d: show HID descriptor, if available  
  8.     -p: show possible events (errs, dev, name, pos. events)  
  9.     -i: show all device info and possible events  
  10.     -l: label event types and names in plain text  
  11.     -q: quiet (clear verbosity mask)  
  12.     -c: print given number of events then exit  
  13.     -r: print rate events are received  
  14.   
  15. Usage: sendevent <device> <type> <code> <value>  


首先,adb shell进入android设备,运行getevent命令得到如下信息,为各类事件的驱动设备,每部 

硬件可能都不一样,可以说无规律可循,个人觉得掠过吧 
源码 复制 打印 ?
  1. add device 1: /dev/input/event1  
  2.   name:     "pmic8xxx_pwrkey"  
  3. add device 2: /dev/input/event3  
  4.   name:     "apq8064-tabla-snd-card Headset Jack"  
  5. add device 3: /dev/input/event2  
  6.   name:     "apq8064-tabla-snd-card Button Jack"  
  7. add device 4: /dev/input/event5  
  8.   name:     "gpio-keys"  
  9. could not get driver version for /dev/input/mice, Not a typewriter  
  10. add device 5: /dev/input/event0  
  11.   name:     "atmel_mxt_ts"  
  12. add device 6: /dev/input/event4  
  13.   name:     "mhl_rcp"  


在点击设备屏幕之后得到: 
源码 复制 打印 ?
  1. /dev/input/event0: 0003 0039 000002a5  
  2. /dev/input/event0: 0003 0030 00000004  
  3. /dev/input/event0: 0003 0035 0000017b  
  4. /dev/input/event0: 0003 0036 000001cf  
  5. /dev/input/event0: 0003 003a 0000001c  
  6. /dev/input/event0: 0000 0000 00000000  
  7. /dev/input/event0: 0003 0039 ffffffff  
  8. /dev/input/event0: 0000 0000 00000000  

很难辨认,加-l参数后得到 ( getevent -l ) 
源码 复制 打印 ?
  1. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     000002a6  
  2. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004  
  3. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b  
  4. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf  
  5. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c  
  6. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  
  7. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     ffffffff  
  8. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  

格式为 device: type code value,即 设备、输入设备类型、按键扫描码、附加码,具体定义可从kernel/include/linux/input.h中获得,至于这个头文件,途径之一是从google官网源码中获取: 

type: 输入设备类型,在手机系统中经常使用的键盘(keyboard)和小键盘(kaypad)属于按键设 
备EV_KEY,轨迹球属于相对设备EV_REL,触摸屏属于绝对设备EV_ABS 
code: 按键扫描码,区别于ASCII码和SDK中KeyEvent的键码 
value: 附加码,1/0 down/up 

第一行:可理解为一次touch的开始 
第2行:可理解为点击开始 
第3行:触摸点x坐标 
第4行:触摸点y坐标 
第5行:可理解为触摸点大小 
第6行:事件同步(点击结束) 
第7行:一次touch结束 
第8行:事件同步(事件结束) 

一次touch此8行是必须的,如果是longTouch呢,在touch的基础上,重复若干次第2~6行,即看起 
来可能是这样子: 
源码 复制 打印 ?
  1. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     000002a6  
  2. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004  
  3. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b  
  4. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf  
  5. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c  
  6. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  
  7.   
  8. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004  
  9. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b  
  10. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf  
  11. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c  
  12. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  
  13.   
  14. /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004  
  15. /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b  
  16. /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf  
  17. /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c  
  18. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  
  19.   
  20. ......  
  21.   
  22. /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     ffffffff  
  23. /dev/input/event0: EV_SYN       SYN_REPORT                  00000000  


如果是drag呢,在longTouch的基础上,xy坐标从起点到终点是渐变的,其他可认为一样。 



对于按键,HOME为例,一目了然: 
源码 复制 打印 ?
  1. /dev/input/event0: 0001 0066 00000001  
  2. /dev/input/event0: 0000 0000 00000000  
  3. /dev/input/event0: 0001 0066 00000000  
  4. /dev/input/event0: 0000 0000 00000000  
  5.   
  6. /dev/input/event0: EV_KEY       KEY_HOME             DOWN  
  7. /dev/input/event0: EV_SYN       SYN_REPORT          00000000  
  8. /dev/input/event0: EV_KEY       KEY_HOME             UP  
  9. /dev/input/event0: EV_SYN       SYN_REPORT          00000000  


所以清楚了之后,使用sendevent进行事件模拟就很轻松了,关键是从input.h中获取按键对应的扫 

描码,也许每个版本的系统中input.h的内容都稍有不同,这个很头疼。 

值得注意的是使用getevent获取的数值都是16进制的,而sendevent使用的是10进制的,需要进行 

转换。 

如点击坐标: 120,254 
源码 复制 打印 ?
  1. sendevent /dev/input/event1 0003 0057 00000000      <---事件开始   
  2. sendevent /dev/input/event1 0003 0048 00000010      <---点击开始  
  3. sendevent /dev/input/event1 0003 0058 00000070      <---  触摸范围  
  4. sendevent /dev/input/event1 0003 0053 00000120      <---  x坐标  
  5. sendevent /dev/input/event1 0003 0054 00000254      <---  y坐标  
  6. sendevent /dev/input/event1 0000 0000 00000000      <---点击结束(同步)  
  7. sendevent /dev/input/event1 0003 0057 4294967295        <---事件结束  
  8. sendevent /dev/input/event1 0000 0000 00000000      <---事件同步  

翻译为: 
type code value 
EV_ABS ABS_MT_TRACKING_ID 00000000 <---事件开始 
EV_ABS ABS_MT_TOUCH_MAJOR 00000010 <---点击开始 
EV_ABS ABS_MT_PRESSURE 00000070 <--- 触摸范围 
EV_ABS ABS_MT_POSITION_X 00000120 <--- x坐标 
EV_ABS ABS_MT_POSITION_Y 00000254 <--- y坐标 
EV_SYN SYN_REPORT 00000000 <---点击结束(同步) 
EV_ABS ABS_MT_TRACKING_ID 4294967295 <---事件结束 
EV_SYN SYN_REPORT 00000000 <---事件同步 



对于longTouch,重复几次上面提到的步骤,而drag再弄个坐标渐变。 

按键方面(MENU) DOWN:1 UP:0 
源码 复制 打印 ?
  1. sendevent /dev/input/event0 0001 0102 0000000001  
  2. sendevent /dev/input/event0 0000 0000 0000000000  
  3. sendevent /dev/input/event0 0001 0102 0000000000  
  4. sendevent /dev/input/event0 0000 0000 0000000000  
  5.   
  6. EV_KEY       KEY_MENU             DOWN  
  7. EV_SYN       SYN_REPORT         00000000  
  8. EV_KEY       KEY_MENU             UP  
  9. EV_SYN       SYN_REPORT         00000000  

此外还可以模拟可见字符按键。 




到这里是否觉得getevent好用好理解,但sendevent却超级麻烦。没关系,如果真不想用sendevent 

模拟事件的话,可以转向input命令。 

个人觉得这个input命令是个重量级的东东,调用时间非常长,貌似低系统版本和高系统版本的input提 

供的功能还不一样,但它毕竟好用啊,如下: 
源码 复制 打印 ?
  1. usage: input ...  
  2.        input text <string>  
  3.        input keyevent <key code number or name>  
  4.        input tap <x> <y>  
  5.        input swipe <x1> <y1> <x2> <y2>  

可见除了longTouch无法模拟之外,其他的都很简便了 

输入文本: input text abcdefg 
按键 : input keyevent KEYCODE_MENU 
点击 : input tap 100 300 
拖拽 : input swipe 100 600 500 600 

①对于文本输入,以下字符需要加 \ 进行转义: 
` ' " ~ # & ( ) | \ ; < > 

②对于longTouch,使用input如何模拟? 

③最后,在android中不管使用sendevent或者input,如何能模拟输入非ASCII字符呢,比如中文? 
这是个难题


你可能感兴趣的:(Android getevent/senevent)