Android 自带了 getevent 和 sendevent,分别用于获取设备报送的事件和模拟产生事件,前者用于辅助设备驱动的验证,后者用于模拟事件进行上层应用的验证。


关于event设备的获取,在 /proc/bus/input/devices 下面:

$ adb shell cat /proc/bus/input/devices

0 getevent和sendevent用法:

$ adb shell getevent -h
Usage: getevent [-t] [-n] [-s switchmask] [-S] [-v [mask]] [-d] [-p] [-i] [-l] [-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, props=64)
-d: show HID descriptor, if available
-p: show possible events (errs, dev, name, pos. events)
-i: show all device info and possible events
-l: label event types and names in plain text
-q: quiet (clear verbosity mask)
-c: print given number of events then exit
-r: print rate events are received

$ adb shell sendevent -h
use: sendevent device type code value

1、模拟发送一个Power键:

$ export KEYCODE_POWER=26
$ input keyevent ${KEYCODE_HOME}
或者:
先获取gpio-keys event的设备接口:
$ adb shell cat /proc/bus/input/devices | grep -A 5 gpio-keys | grep event
H: Handlers=event5

# Press power button(Don't release)
$ adb shell sendevent /dev/input/event5 1 $((0x74)) 1
$ adb shell sendevent /dev/input/event5 0 0 0

# Release power button
$ adb shell sendevent /dev/input/event5 1 $((0x74)) 0
$ adb shell sendevent /dev/input/event5 0 0 0

2、模拟获取Power键的事件

先执行
$ adb shell getevent /dev/input/event5

然后按下power键并观察输出:
按下时:
0001 0074 00000001
0000 0000 00000000

弹起来时:
0001 0074 00000000
0000 0000 00000000

可以看到更好跟我们上面模拟的一样,注,上面那些值是十六进制的,如果想要 更加直观地分析获取的上报事件可以参考 在 Android 通过 get_event 获得 input 设备 上报event

http://blog.csdn.net/hellowxwworld/article/details/10733567


getevent/sendevent源码

这两个命令的源码在system/core/toolbox/下,sendevent.c getevent.c

getevent

使用getevent获得/dev/input/eventX设备汇报的事件,这个命令还会输出所有event设备的基本信息,如下:

add device 1: /dev/input/event1
name: "mxc_ts"
add device 2: /dev/input/event0
name: "mxckpd"

表明系统有两个event设备,分别对应着input设备touchscreen,keyboard


Android可以使用sendevent来模拟触屏,键盘以及其他类型的event事件,

sendevent /dev/input/eventX type code value

/dev/input/eventX 对应一个event设备,可以通过getevent获得可用的event设备

type, code, value的定义可参看kernel/include/linux/input.h


type如下定义

[html]view plaincopy
  1. /*
  2. *Eventtypes
  3. */
  4. #defineEV_SYN0x00
  5. #defineEV_KEY0x01
  6. #defineEV_REL0x02
  7. #defineEV_ABS0x03
  8. #defineEV_MSC0x04
  9. #defineEV_SW0x05
  10. #defineEV_LED0x11
  11. #defineEV_SND0x12
  12. #defineEV_REP0x14
  13. #defineEV_FF0x15
  14. #defineEV_PWR0x16
  15. #defineEV_FF_STATUS0x17
  16. #defineEV_MAX0x1f
  17. #defineEV_CNT(EV_MAX+1)

一般来说,常用的是EV_KEY, EV_REL, EV_ABS, EV_SYN

分别对应keyboard, 相对坐标, 绝对坐标, 同步事件


EV_SYN则表示一组完整事件已经完成,需要处理,EV_SYN的code定义事件分发的类型

EV_SYN对应的code如下

[html]view plaincopy
  1. /*
  2. *Synchronizationevents.
  3. */
  4. #defineSYN_REPORT0
  5. #defineSYN_CONFIG1
  6. #defineSYN_MT_REPORT2

EV_KEY的code比较多,这里就不列出来了,可参照input.h


EV_REL对应的code

[html]view plaincopy
  1. /*
  2. *Relativeaxes
  3. */
  4. #defineREL_X0x00
  5. #defineREL_Y0x01
  6. #defineREL_Z0x02
  7. #defineREL_RX0x03
  8. #defineREL_RY0x04
  9. #defineREL_RZ0x05
  10. #defineREL_HWHEEL0x06
  11. #defineREL_DIAL0x07
  12. #defineREL_WHEEL0x08
  13. #defineREL_MISC0x09
  14. #defineREL_MAX0x0f
  15. #defineREL_CNT(REL_MAX+1)

EV_ABS对应的code

[html]view plaincopy
  1. /*
  2. *Absoluteaxes
  3. */
  4. #defineABS_X0x00
  5. #defineABS_Y0x01
  6. #defineABS_Z0x02
  7. #defineABS_RX0x03
  8. #defineABS_RY0x04
  9. #defineABS_RZ0x05
  10. #defineABS_THROTTLE0x06
  11. #defineABS_RUDDER0x07
  12. #defineABS_WHEEL0x08
  13. #defineABS_GAS0x09
  14. #defineABS_BRAKE0x0a
  15. #defineABS_HAT0X0x10
  16. #defineABS_HAT0Y0x11
  17. #defineABS_HAT1X0x12
  18. #defineABS_HAT1Y0x13
  19. #defineABS_HAT2X0x14
  20. #defineABS_HAT2Y0x15
  21. #defineABS_HAT3X0x16
  22. #defineABS_HAT3Y0x17
  23. #defineABS_PRESSURE0x18
  24. #defineABS_DISTANCE0x19
  25. #defineABS_TILT_X0x1a
  26. #defineABS_TILT_Y0x1b
  27. #defineABS_TOOL_WIDTH0x1c
  28. #defineABS_VOLUME0x20
  29. #defineABS_MISC0x28
  30. #defineABS_MT_TOUCH_MAJOR0x30/*Majoraxisoftouchingellipse*/
  31. #defineABS_MT_TOUCH_MINOR0x31/*Minoraxis(omitifcircular)*/
  32. #defineABS_MT_WIDTH_MAJOR0x32/*Majoraxisofapproachingellipse*/
  33. #defineABS_MT_WIDTH_MINOR0x33/*Minoraxis(omitifcircular)*/
  34. #defineABS_MT_ORIENTATION0x34/*Ellipseorientation*/
  35. #defineABS_MT_POSITION_X0x35/*CenterXellipseposition*/
  36. #defineABS_MT_POSITION_Y0x36/*CenterYellipseposition*/
  37. #defineABS_MT_TOOL_TYPE0x37/*Typeoftouchingdevice*/
  38. #defineABS_MT_BLOB_ID0x38/*Groupasetofpacketsasablob*/
  39. #defineABS_MT_TRACKING_ID0x39/*UniqueIDofinitiatedcontact*/
  40. #defineABS_MT_PRESSURE0x3a/*Pressureoncontactarea*/
  41. #defineABS_MAX0x3f
  42. #defineABS_CNT(ABS_MAX+1)


input keyevent

如果想模拟按键,send event用起来比较繁琐,可以用input keyevent代替

下面是input keyevent几个比较常用的用法:


input keyevent 3 // Home

input keyevent 4 // Back

input keyevent 19 //Up

input keyevent 20 //Down

input keyevent 21 //Left

input keyevent 22 //Right

input keyevent 23 //Select/Ok

input keyevent 24 //Volume+

input keyevent 25 // Volume-

input keyevent 82 // Menu 菜单


用senevent 模拟触屏事件

sendevent /dev/input/event1 0003 0000 0000015e // ABS x 坐标

sendevent /dev/input/event1: 0003 0001 000000df // ABS y 坐标

sendevent /dev/input/event1: 0001 014a 00000001 // BTN touch事件 值为1

sendevent /dev/input/event1: 0003 0018 00000000 // ABS pressure事件

sendevent /dev/input/event1: 0001 014a 00000000 // BTN touch事件 值为0

sendevent /dev/input/event1: 0000 0000 00000000 // sync事件

http://blog.csdn.net/kickxxx/article/details/7482392



1. getevent

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

例如:我们想看看触摸屏的上报速率

# getevent -r /dev/input/event0getevent -r /dev/input/event0 0003 003e0305a449 0003 003e 00000000 0000 0000 00000000 0003 003e 0365a04e 0003 003e 00000000 0000 0000 00000000 rate 38 0003 003e 0375a051 0003 003e 00000000 0000 0000 00000000 rate 84 0003 003e 0345a057 0003 003e 00000000 0000 0000 00000000 rate 80 0003 003e 1295a05e 0003 003e 00000000 0000 0000 00000000 rate 79 0003 003e 0345a068 0003 003e 00000000 0000 0000 00000000 rate 79 0003 003e 03b59c70

2. input

usage: input [text|keyevent]input text <string> input keyevent <event_code>

例如,输入一串字母 input text "hello" 输入一个MENU按键 input keyevent 82

3.sendevent

usage: sendevent [device] [type] [code] [value]

这条命令可以输入所有的input event事件

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

adb shell sendevent /dev/input/event0 3 0 40 //ABS X 40 adb shell sendevent /dev/input/event0 3 1 210 // ABS Y 210 adb shell sendevent /dev/input/event0 1 330 1 //KEY BTN_TOUCH 1 adb shell sendevent /dev/input/event0 0 0 0 //SYNC EVENT adb shell sendevent /dev/input/event0 1 330 0 //KEY BTN_TOUCH 0 adb shell sendevent /dev/input/event0 0 0 0 //SYNC EVENT
http://blog.sina.com.cn/s/blog_503e61a80100n8x5.html

更多相关文章

  1. android动态壁纸---线条
  2. android RecyclerView响应点击事件
  3. Android(安卓)ApiDemos示例解析(21):App->Device Admin
  4. Android使用ListView构造复杂界面,响应点击事件,通过Intent跳转act
  5. Android开发 第2课 控件TextView、Plain Text、ImageView、 Butt
  6. Android(安卓)自定义View——拖动选择时间控件
  7. Android(安卓)获取view在屏幕中的位置
  8. EventBus
  9. unity3d android真机测试的2种方法

随机推荐

  1. 十大你需要在PHP中避免的坑
  2. PHP之使用cURL实现Get和Post请求
  3. 三分钟带你了解PHP四大主流框架的优缺点
  4. 用 Composer 开源组件构建自己的 PHP 框
  5. 基于PHP实现短信验证码发送次数限制解析
  6. 分享PHP扫码登录原理及实现方法
  7. 学习PHP实现SMTP邮件的发送
  8. 实例解析PHP var关键字相关原理及使用
  9. 了解php判断电子邮件是否正确方法
  10. 关于php公历农历的互相转换,你可能会需要!