失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android通过代码模拟物理 屏幕点击事件

Android通过代码模拟物理 屏幕点击事件

时间:2023-11-01 01:30:52

相关推荐

Android通过代码模拟物理 屏幕点击事件

本文讲的是通过使用代码,可以控制手机的屏幕和物理按键,也就是说不只是在某一个APP里去操作,而是整个手机系统。

getevent/sendevent

getevent&sendevent 是android系统下的一个工具,可以模拟多种按键和触屏操作,产生的是raw event,raw event经过event hub处理产生最终的gesture事件。getevent用于获取当前系统input设备的一些参数和实时事件的数据;sendevent用于发送input事件,这俩命令的作用就是相当于解放了手,可以通过命令直接调用Linux底层来控制手机,工具的源码位于Android SDK的system/core/toolbox下(sendevent.c getevent.c)。

getevent

用法说明:

[plain]view plain copy#getevent-h Usage:getevent[-t][-n][-sswitchmask][-S][-v[mask]][-p][-q][-ccount][-r][device] -t:showtimestamps -n:don'tprintnewlines -s:printswitchstatesforgivenbits -S:printallswitchstates -v:verbositymask(errs=1,dev=2,name=4,info=8,vers=16,pos.events=32) -p:showpossibleevents(errs,dev,name,pos.events) -q:quiet(clearverbositymask) -c:printgivennumberofeventsthenexit -r:printrateeventsarereceived 其中[-t] 参数显示事件的时间戳,[-n] 取消事件显示时的换行符,[-s switchmask] 得到指定位的开关状态,[-S] 得到所有开关的状态,[-v [mask]] 根据mask的值显示相关信息,后面详细介绍mask的使用方法,[-p] 显示每个设备支持的事件类型和编码,[-q]只显示事件数据,[-c count] 只显示count次事件的数据,[-r]显示事件接收频率。

[java]view plain copyshell@android:/$getevent-p[java]view plain copygetevent-p adddevice1:/dev/input/event7 name:"gpio-keys" events: KEY(0001):0066 inputprops: <none> adddevice2:/dev/input/event2 name:"alps" events: ABS(0003):0000:value12,min-4096,max4096,fuzz0,flat0,resolution0 0001:value-4,min-4096,max4096,fuzz0,flat0,resolution0 0002:value-252,min-4096,max4096,fuzz0,flat0,resolution0 000a:value0,min-4096,max4096,fuzz0,flat0,resolution0 0010:value0,min-4096,max4096,fuzz0,flat0,resolution0 0011:value0,min-4096,max4096,fuzz0,flat0,resolution0 inputprops: <none> adddevice3:/dev/input/event6 name:"7k_handset" events: KEY(0001):006b0073007400e2 inputprops: <none> adddevice4:/dev/input/event5 name:"proximity_sensor" events: ABS(0003):0019:value1,min0,max1,fuzz0,flat0,resolution0 inputprops: <none> adddevice5:/dev/input/event4 name:"accelerometer_sensor" events: inputprops: <none> adddevice6:/dev/input/event3 name:"magnetic_sensor" events: inputprops: <none> adddevice7:/dev/input/event1 name:"7x27a_kp" events: KEY(0001):0073 inputprops: <none> adddevice8:/dev/input/event0 name:"sec_touchscreen" events: KEY(0001):0066008b009e00d9 ABS(0003):002f:value0,min0,max4,fuzz0,flat0,resolution0 0030:value0,min0,max255,fuzz0,flat0,resolution0 0032:value0,min0,max100,fuzz0,flat0,resolution0 0035:value0,min0,max480,fuzz0,flat0,resolution0 0036:value0,min0,max800,fuzz0,flat0,resolution0 0039:value0,min0,max4,fuzz0,flat0,resolution0 LED(0011):0008 inputprops: INPUT_PROP_DIRECT 可以看到 [-p] 参数显示出来当前系统存在的所有input设备,并且把每个设备支持的事件类型以及编码都列举了出来。

每一个device相当于手机所支持的input设备,每个device里面的events下:KEY(0001) 、ABS(0003)、SYN(0000)等表示该设备所支持的事件类型:EV_SYN[0000] (同步事件),EV_KEY[0001] (按键事件),EV_ABS[0003] (绝对值事件)

举例event0中的KEY类型:

[java]view plain copyKEY(0001):0066008b009e00d9

表示sec_touchscreen支持的按键编码有:KEY_HOME[0066] (HOME键),KEY_MENU[008b] (MENU键)

KEY_BACK[009e] (BACK键),KEY_SEARCH[00d9] (SEARCH键)

举例event0中的ABS类型:

[java]view plain copyABS(0003):002f:value0,min0,max4,fuzz0,flat0,resolution0 0030:value0,min0,max255,fuzz0,flat0,resolution0 0035:value0,min0,max480,fuzz0,flat0,resolution0 0036:value0,min0,max800,fuzz0,flat0,resolution0

表示sec_touchscreen支持的绝对值编码有:ABS_MT_TOUCH_MAJOR[0030] (接触面长轴值) {有效值范围[0, 255]}

ABS_MT_POSITION_X[0035] (x轴坐标) {有效值范围[0, 480]}

ABS_MT_POSITION_Y[0036] (y轴坐标) {有效值范围[0, 800]}

实例:

连接真机,windows打开cmd命令:adb shell:

命令行直接:

[java]view plain copy127|shell@android:/$getevent cmd便会不断的输出log日志,等待输入设备,我们触摸屏幕或是手机物理按键,便会看到这里的变化,可以看到每一个事件所对应的type、code、value,同时也可知晓device所对应的event:

传送门,通过getevent获取点击屏幕的位置坐标,你可以更好的理解getevent的工作流程:

/liu_zhen_wei/article/details/12559277

sendevent

用法说明:

[java]view plain copy#sendevent use:sendeventdevicetypecodevalue 可以看到sendevent需要4个参数即:device,type,code,value。这些值可以由input子系统定义,也可以从getevent里面获取。type其实就是和getevent中的支持事件类型所对应的,type, code, value的定义可参看kernel/include/linux/input.h

需要注意的是在getevent中code显示的是十六进制,而sendevent时需要用十进制

我就copy一个EV_ABS类型所对应的code:

[java]view plain copy/* *Absoluteaxes */ #defineABS_X0x00 #defineABS_Y0x01 #defineABS_Z0x02 #defineABS_RX0x03 #defineABS_RY0x04 #defineABS_RZ0x05 #defineABS_THROTTLE0x06 #defineABS_RUDDER0x07 #defineABS_WHEEL0x08 #defineABS_GAS0x09 #defineABS_BRAKE0x0a #defineABS_HAT0X0x10 #defineABS_HAT0Y0x11 #defineABS_HAT1X0x12 #defineABS_HAT1Y0x13 #defineABS_HAT2X0x14 #defineABS_HAT2Y0x15 #defineABS_HAT3X0x16 #defineABS_HAT3Y0x17 #defineABS_PRESSURE0x18 #defineABS_DISTANCE0x19 #defineABS_TILT_X0x1a #defineABS_TILT_Y0x1b #defineABS_TOOL_WIDTH0x1c #defineABS_VOLUME0x20 #defineABS_MISC0x28 #defineABS_MT_TOUCH_MAJOR0x30/*Majoraxisoftouchingellipse*/ #defineABS_MT_TOUCH_MINOR0x31/*Minoraxis(omitifcircular)*/ #defineABS_MT_WIDTH_MAJOR0x32/*Majoraxisofapproachingellipse*/ #defineABS_MT_WIDTH_MINOR0x33/*Minoraxis(omitifcircular)*/ #defineABS_MT_ORIENTATION0x34/*Ellipseorientation*/ #defineABS_MT_POSITION_X0x35/*CenterXellipseposition*/ #defineABS_MT_POSITION_Y0x36/*CenterYellipseposition*/ #defineABS_MT_TOOL_TYPE0x37/*Typeoftouchingdevice*/ #defineABS_MT_BLOB_ID0x38/*Groupasetofpacketsasablob*/ #defineABS_MT_TRACKING_ID0x39/*UniqueIDofinitiatedcontact*/ #defineABS_MT_PRESSURE0x3a/*Pressureoncontactarea*/ #defineABS_MAX0x3f #defineABS_CNT(ABS_MAX+1)

源码中定义的0x35,0x36就对应我在上文说getevent所举sec_touchscreen支持的绝对值编码。

实例:

比如我们要模拟一次BACK事件,根据上面getevent中sec_touchscreen支持的信息可知BACK的编码为 0x9e 转换为十进制后即158,那我们输入如下命令即可模拟一次BACK键的按下和弹起:

[java]view plain copy#sendevent/dev/input/event011581 #sendevent/dev/input/event011580 device需要是支持该按键的设备这里是 sec_touchscreen ;type为1表示是按键事件;value为1表示按下,为0表示弹起,一次按键事件由按下和弹起两个操作组成。

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

附,这是网络文章说的在某坐标点上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

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

input keyevent

发送键盘事件

用法说明:

adb shell input keyevent “value”

usage: input ...

input text <string>

input keyevent <key code number or name>

input tap <x> <y>

input swipe <x1> <y1> <x2> <y2>

如上,input后可以跟很多参数, text相当于输入内容,keyevent相当于手机物理或是屏幕按键,tap相当于touch事件,swipe相当于滑动~~是不是很赞?

先列举 input keyevent 几个比较常用的code值:

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 菜单

我们来试验一下:

[java]view plain copyshell@android:/$inputkeyevent3 看一下手机是不是真的返回到了主界面?

再来个输入:

[java]view plain copyshell@android:/$inputtext"helloworld!" inputtext"helloworld!"

再来个tap:

[java]view plain copyshell@android:/$inputtap168252 inputtap168252

最后试一下 swipe:

[java]view plain copyshell@android:/$inputswipe100250200280 inputswipe100250200280 shell@android:/$inputswipe100250220320 inputswipe100250220320 shell@android:/$inputswipe100250280400 inputswipe100250280400 shell@android:/$inputswipe100250300480 inputswipe100250300480 shell@android:/$inputswipe100250350550 inputswipe100250350550 shell@android:/$inputswipe100250400650 inputswipe100250400650 shell@android:/$inputswipe100250480600 inputswipe100250480600 效果图:

我们在adb shell下试验了各种命令,可是代码里该怎么做呢?看下面

[java]view plain copy/** *执行shell命令 * *@paramcmd */ privatevoidexecShellCmd(Stringcmd){ try{ //申请获取root权限,这一步很重要,不然会没有作用 Processprocess=Runtime.getRuntime().exec("su"); //获取输出流 OutputStreamoutputStream=process.getOutputStream(); DataOutputStreamdataOutputStream=newDataOutputStream( outputStream); dataOutputStream.writeBytes(cmd); dataOutputStream.flush(); dataOutputStream.close(); outputStream.close(); }catch(Throwablet){ t.printStackTrace(); } } 在想要执行的地方:

[java]view plain copyexecShellCmd("getevent-p"); execShellCmd("sendevent/dev/input/event011581"); execShellCmd("sendevent/dev/input/event011580"); execShellCmd("inputkeyevent3");//home execShellCmd("inputtext'helloworld!'"); execShellCmd("inputtap168252"); execShellCmd("inputswipe100250200280");

至此结束,是不是感觉自己也能做出按键精灵了~~~

附:input keyevent所对应全部key值:

KeyCode Keyevent Value

KEYCODE_MENU 1

KEYCODE_SOFT_RIGHT 2

KEYCODE_HOME 3

KEYCODE_BACK 4

KEYCODE_CALL 5

KEYCODE_ENDCALL 6

KEYCODE_0 7

KEYCODE_1 8

KEYCODE_2 9

KEYCODE_3 10

KEYCODE_4 11

KEYCODE_5 12

KEYCODE_6 13

KEYCODE_7 14

KEYCODE_8 15

KEYCODE_9 16

KEYCODE_STAR 17

KEYCODE_POUND 18

KEYCODE_DPAD_UP 19

KEYCODE_DPAD_DOWN 20

KEYCODE_DPAD_LEFT 21

KEYCODE_DPAD_RIGHT 22

KEYCODE_DPAD_CENTER 23

KEYCODE_VOLUME_UP 24

KEYCODE_VOLUME_DOWN 25

KEYCODE_POWER 26

KEYCODE_CAMERA 27

KEYCODE_CLEAR 28

KEYCODE_A 29

KEYCODE_B 30

KEYCODE_C 31

KEYCODE_D 32

KEYCODE_E 33

KEYCODE_F 34

KEYCODE_G 35

KEYCODE_H 36

KEYCODE_I 37

KEYCODE_J 38

KEYCODE_K 39

KEYCODE_L 40

KEYCODE_M 41

KEYCODE_N 42

KEYCODE_O 43

KEYCODE_P 44

KEYCODE_Q 45

KEYCODE_R 46

KEYCODE_S 47

KEYCODE_T 48

KEYCODE_U 49

KEYCODE_V 50

KEYCODE_W 51

KEYCODE_X 52

KEYCODE_Y 53

KEYCODE_Z 54

KEYCODE_COMMA 55

KEYCODE_PERIOD 56

KEYCODE_ALT_LEFT 57

KEYCODE_ALT_RIGHT 58

KEYCODE_SHIFT_LEFT 59

KEYCODE_SHIFT_RIGHT 60

KEYCODE_TAB 61

KEYCODE_SPACE 62

KEYCODE_SYM 63

KEYCODE_EXPLORER 64

KEYCODE_ENVELOPE 65

KEYCODE_ENTER 66

KEYCODE_DEL 67

KEYCODE_GRAVE 68

KEYCODE_MINUS 69

KEYCODE_EQUALS 70

KEYCODE_LEFT_BRACKET 71

KEYCODE_RIGHT_BRACKET 72

KEYCODE_BACKSLASH 73

KEYCODE_SEMICOLON 74

KEYCODE_APOSTROPHE 75

KEYCODE_SLASH 76

KEYCODE_AT 77

KEYCODE_NUM 78

KEYCODE_HEADSETHOOK 79

KEYCODE_FOCUS 80

KEYCODE_PLUS 81

KEYCODE_MENU 82

KEYCODE_NOTIFICATION 83

KEYCODE_SEARCH 84

TAG_LAST_KEYCODE 85

如果觉得《Android通过代码模拟物理 屏幕点击事件》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。