adb shell 模拟发送按键

来源:互联网 发布:mysql去重函数 编辑:程序博客网 时间:2024/05/16 11:58

原文地址:http://blog.sina.com.cn/s/blog_8acf1be10102w01x.html

模拟按键


1. 模拟按键的Down or UP事件
【音量减 按下】114是按键值
sendevent /dev/input/event1 1 114 1  

sendevent /dev/input/event1 0 0 0
 

【音量减 抬起】
sendevent /dev/input/event1 1 114 0

sendevent /dev/input/event1 0 0 0

2. 模拟按键
//这条命令相当于按了设备的Backkey键
adb shell input keyevent 4   


 //可以解锁屏幕
adb shell input keyevent  82


//在屏幕上做划屏操作,前四个数为坐标点,后面是滑动的时间(单位毫秒)

adb shell input swipe 50 250 250 250 500


//在屏幕上点击坐标点x=50  y=250的位置。

adb shell input tap 50 250


//输入字符abc

adb shell input text abc


3. 获取热键值
//将16进制转换为10进制就是对应的按键值
adb shell getevent

===============================================================
以下转载自:http://blog.csdn.net/chen825919148/article/details/18732167
android测试之getevent/sendevent
 关于在android平台上捕获事件的资料互联网上已经铺天盖地,但个人觉得可用性都不太大,大部仅

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

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

详细用法如下:
源码复制打印?

    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 
     
    Usage: sendevent  



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

硬件可能都不一样,可以说无规律可循,个人觉得掠过吧
源码复制打印?

    add device 1: /dev/input/event1 
      name:     "pmic8xxx_pwrkey" 
    add device 2: /dev/input/event3 
      name:     "apq8064-tabla-snd-card Headset Jack" 
    add device 3: /dev/input/event2 
      name:     "apq8064-tabla-snd-card Button Jack" 
    add device 4: /dev/input/event5 
      name:     "gpio-keys" 
    could not get driver version for /dev/input/mice, Not a typewriter 
    add device 5: /dev/input/event0 
      name:     "atmel_mxt_ts" 
    add device 6: /dev/input/event4 
      name:     "mhl_rcp" 



在点击设备屏幕之后得到:
源码复制打印?

    /dev/input/event0: 0003 0039 000002a5 
    /dev/input/event0: 0003 0030 00000004 
    /dev/input/event0: 0003 0035 0000017b 
    /dev/input/event0: 0003 0036 000001cf 
    /dev/input/event0: 0003 003a 0000001c 
    /dev/input/event0: 0000 0000 00000000 
    /dev/input/event0: 0003 0039 ffffffff 
    /dev/input/event0: 0000 0000 00000000 


很难辨认,加-l参数后得到 ( getevent -l )
源码复制打印?

    /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     000002a6 
    /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004 
    /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b 
    /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf 
    /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c 
    /dev/input/event0: EV_SYN       SYN_REPORT                 00000000 
    /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     ffffffff 
    /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行,即看起
来可能是这样子:
源码复制打印?

    /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     000002a6 
    /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004 
    /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b 
    /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf 
    /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c 
    /dev/input/event0: EV_SYN       SYN_REPORT                 00000000 
     
    /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004 
    /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b 
    /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf 
    /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c 
    /dev/input/event0: EV_SYN       SYN_REPORT                 00000000 
     
    /dev/input/event0: EV_ABS       ABS_MT_TOUCH_MAJOR   00000004 
    /dev/input/event0: EV_ABS       ABS_MT_POSITION_X      0000017b 
    /dev/input/event0: EV_ABS       ABS_MT_POSITION_Y      000001cf 
    /dev/input/event0: EV_ABS       ABS_MT_PRESSURE         0000001c 
    /dev/input/event0: EV_SYN       SYN_REPORT                 00000000 
     
    ...... 
     
    /dev/input/event0: EV_ABS       ABS_MT_TRACKING_ID     ffffffff 
    /dev/input/event0: EV_SYN       SYN_REPORT                 00000000 



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



对于按键,HOME为例,一目了然:
源码复制打印?

    /dev/input/event0: 0001 0066 00000001 
    /dev/input/event0: 0000 0000 00000000 
    /dev/input/event0: 0001 0066 00000000 
    /dev/input/event0: 0000 0000 00000000 
     
    /dev/input/event0: EV_KEY       KEY_HOME             DOWN 
    /dev/input/event0: EV_SYN       SYN_REPORT          00000000 
    /dev/input/event0: EV_KEY       KEY_HOME             UP 
    /dev/input/event0: EV_SYN       SYN_REPORT          00000000 



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

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

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

转换。

如点击坐标: 120,254
源码复制打印?

    sendevent /dev/input/event1 0003 0057 00000000      <---事件开始  
    sendevent /dev/input/event1 0003 0048 00000010      <---点击开始 
    sendevent /dev/input/event1 0003 0058 00000070      <---  触摸范围 
    sendevent /dev/input/event1 0003 0053 00000120      <---  x坐标 
    sendevent /dev/input/event1 0003 0054 00000254      <---  y坐标 
    sendevent /dev/input/event1 0000 0000 00000000      <---点击结束(同步) 
    sendevent /dev/input/event1 0003 0057 4294967295        <---事件结束 
    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
源码复制打印?

    sendevent /dev/input/event0 0001 0102 0000000001 
    sendevent /dev/input/event0 0000 0000 0000000000 
    sendevent /dev/input/event0 0001 0102 0000000000 
    sendevent /dev/input/event0 0000 0000 0000000000 
     
    EV_KEY       KEY_MENU             DOWN 
    EV_SYN       SYN_REPORT         00000000 
    EV_KEY       KEY_MENU             UP 
    EV_SYN       SYN_REPORT         00000000 


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

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

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

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

供的功能还不一样,但它毕竟好用啊,如下:
源码复制打印?

    usage: input ... 
           input text  
           input keyevent  
           input tap  
           input swipe  


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

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

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

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

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