关于在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: printswitchstatesforgiven bits
  5. -S: print allswitchstates
  6. -v: verbosity mask (errs=1, dev=2, name=4, info=8, vers=16, pos. events=32, props=64)
  7. -d: show HID descriptor,ifavailable
  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. Usage: sendevent <device> <type> <code> <value>


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

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


在点击设备屏幕之后得到:
源码 复制 打印 ?
  1. /dev/input/event0:00030039000002a5
  2. /dev/input/event0:0003003000000004
  3. /dev/input/event0:000300350000017b
  4. /dev/input/event0:00030036000001cf
  5. /dev/input/event0:0003003a 0000001c
  6. /dev/input/event0:0000000000000000
  7. /dev/input/event0:00030039ffffffff
  8. /dev/input/event0:0000000000000000

很难辨认,加-l参数后得到 ( getevent -l )
源码 复制 打印 ?
  1. /dev/input/event0: EV_ABS ABS_MT_TRACKING_ID 000002a6
  2. /dev/input/event0: EV_ABS ABS_MT_TOUCH_MAJOR00000004
  3. /dev/input/event0: EV_ABS ABS_MT_POSITION_X0000017b
  4. /dev/input/event0: EV_ABS ABS_MT_POSITION_Y000001cf
  5. /dev/input/event0: EV_ABS ABS_MT_PRESSURE 0000001c
  6. /dev/input/event0: EV_SYN SYN_REPORT00000000
  7. /dev/input/event0: EV_ABS ABS_MT_TRACKING_ID ffffffff
  8. /dev/input/event0: EV_SYN SYN_REPORT00000000

格式为 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_MAJOR00000004
  3. /dev/input/event0: EV_ABS ABS_MT_POSITION_X0000017b
  4. /dev/input/event0: EV_ABS ABS_MT_POSITION_Y000001cf
  5. /dev/input/event0: EV_ABS ABS_MT_PRESSURE 0000001c
  6. /dev/input/event0: EV_SYN SYN_REPORT00000000
  7. /dev/input/event0: EV_ABS ABS_MT_TOUCH_MAJOR00000004
  8. /dev/input/event0: EV_ABS ABS_MT_POSITION_X0000017b
  9. /dev/input/event0: EV_ABS ABS_MT_POSITION_Y000001cf
  10. /dev/input/event0: EV_ABS ABS_MT_PRESSURE 0000001c
  11. /dev/input/event0: EV_SYN SYN_REPORT00000000
  12. /dev/input/event0: EV_ABS ABS_MT_TOUCH_MAJOR00000004
  13. /dev/input/event0: EV_ABS ABS_MT_POSITION_X0000017b
  14. /dev/input/event0: EV_ABS ABS_MT_POSITION_Y000001cf
  15. /dev/input/event0: EV_ABS ABS_MT_PRESSURE 0000001c
  16. /dev/input/event0: EV_SYN SYN_REPORT00000000
  17. ......
  18. /dev/input/event0: EV_ABS ABS_MT_TRACKING_ID ffffffff
  19. /dev/input/event0: EV_SYN SYN_REPORT00000000


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



对于按键,HOME为例,一目了然:
源码 复制 打印 ?
  1. /dev/input/event0:0001006600000001
  2. /dev/input/event0:0000000000000000
  3. /dev/input/event0:0001006600000000
  4. /dev/input/event0:0000000000000000
  5. /dev/input/event0: EV_KEY KEY_HOME DOWN
  6. /dev/input/event0: EV_SYN SYN_REPORT00000000
  7. /dev/input/event0: EV_KEY KEY_HOME UP
  8. /dev/input/event0: EV_SYN SYN_REPORT00000000


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

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

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

转换。

如点击坐标: 120,254
源码 复制 打印 ?
  1. sendevent /dev/input/event10003005700000000<---事件开始
  2. sendevent /dev/input/event10003004800000010<---点击开始
  3. sendevent /dev/input/event10003005800000070<---触摸范围
  4. sendevent /dev/input/event10003005300000120<---x坐标
  5. sendevent /dev/input/event10003005400000254<---y坐标
  6. sendevent /dev/input/event10000000000000000<---点击结束(同步)
  7. sendevent /dev/input/event1000300574294967295<---事件结束
  8. sendevent /dev/input/event10000000000000000<---事件同步

翻译为:
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/event0000101020000000001
  2. sendevent /dev/input/event0000000000000000000
  3. sendevent /dev/input/event0000101020000000000
  4. sendevent /dev/input/event0000000000000000000
  5. EV_KEY KEY_MENU DOWN
  6. EV_SYN SYN_REPORT00000000
  7. EV_KEY KEY_MENU UP
  8. EV_SYN SYN_REPORT00000000

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




到这里是否觉得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字符呢,比如中文?
这是个难题


更多相关文章

  1. Android 切换系统语言源码分析
  2. 【Android基础】讲讲Android的事件分发机制
  3. windows下Android源码的分模块下载
  4. Android小项目之--电话与短信服务(附源码)
  5. android视频桌面源码,酒店应用源码等
  6. Android 电子杂志(带翻页效果)源码
  7. android输入法02:openwnn源码解析01—输入流程

随机推荐

  1. android数据库
  2. 谈谈Android的那些事
  3. Android安全加密:对称加密
  4. android:scaleType、android:layout_alig
  5. 搭建 Android(安卓)2.2 开发环境
  6. android 小知识
  7. Android(安卓)新手扫盲
  8. Android接入WebView(五)——浏览器制作总结
  9. Windows下Android平台搭建_2
  10. 控件的android:layout_alignParentTop属