知识为进步之母,而进步又为富强之源泉。这篇文章主要讲述Android代码模拟物理屏幕点击事件相关的知识,希望能为你提供帮助。
一、应用中模拟物理和屏幕点击事件
例如,模拟对某个view的点击事件
private void simulateClick(View view, float x, float y) { long downTime = SystemClock.uptimeMillis(); final MotionEvent downEvent = MotionEvent.obtain(downTime, downTime,MotionEvent.ACTION_DOWN, x, y, 0); downTime += 1000; final MotionEvent upEvent = MotionEvent.obtain(downTime, downTime,MotionEvent.ACTION_UP, x, y, 0); view.onTouchEvent(downEvent); view.onTouchEvent(upEvent); downEvent.recycle(); upEvent.recycle(); }public void setMouseClick(int x, int y){ MotionEvent evenDownt = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100, MotionEvent.ACTION_DOWN, x, y, 0); dispatchTouchEvent(evenDownt); MotionEvent eventUp = MotionEvent.obtain(System.currentTimeMillis(), System.currentTimeMillis() + 100, MotionEvent.ACTION_UP, x, y, 0); dispatchTouchEvent(eventUp); evenDownt.recycle(); eventUp.recycle(); }
这实现原理就是模拟两个MotionEvent (按下和提起) 然后用一个View 来处理这个Event 。
二、Instrumentation实现模拟键盘鼠标事件
// 可以不用在 Activity 中增加任何处理,各 Activity 都可以响应 Instrumentation inst = new Instrumentation(); inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 200, 500, 0)); inst.sendPointerSync(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 200, 500, 0));
三、系统中模拟物理和屏幕点击事件
1、adb shell 进入手机命令行
2、getevent -h 用法说明
[email protected]:/ $ getevent -hUsage: 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
[-t] 参数显示事件的时间戳
[-n] 取消事件显示时的换行符
[-s switchmask] 得到指定位的开关状态
[-S] 得到所有开关的状态
[-v [mask]] 根据mask的值显示相关信息
[-p] 显示每个设备支持的事件类型和编码
[-q] 只显示事件数据
[-c count] 只显示count次事件的数据
[-r] 显示事件接收频率
3、getevent -p 显示出来当前系统存在的所有input设备,并且把每个设备支持的事件类型以及编码
[email protected]:/ $ getevent -padd device 1: /dev/input/event2 name:"hi6421_on" events: KEY (0001): 0074 input props: < none> could not get driver version for /dev/input/mouse0, Not a typewriter add device 2: /dev/input/event4 name:"huawei,touchscreen" events: KEY (0001): 003b003c003d003e003f004000410042 00430044005700bd00be00bf00c000c1 0145014a ABS (0003): 0000: value 0, min 0, max 1079, fuzz 0, flat 0, resolution 0 0001: value 0, min 0, max 1919, fuzz 0, flat 0, resolution 0 0018: value 0, min 0, max 255, fuzz 0, flat 0, resolution 0 0030: value 0, min 0, max 15, fuzz 0, flat 0, resolution 0 0035: value 0, min 0, max 1079, fuzz 0, flat 0, resolution 0 0036: value 0, min 0, max 1919, fuzz 0, flat 0, resolution 0 0039: value 0, min 0, max 15, fuzz 0, flat 0, resolution 0 003a: value 0, min 0, max 255, fuzz 0, flat 0, resolution 0 input props: INPUT_PROP_DIRECT add device 3: /dev/input/event0 name:"mhl_rcp_dev" events: KEY (0001): 00020003000400050006000700080009 000a000b000e001c0034003b003c003d 003e003f00670069006a006c00710072 007300770080008b009e009f00a100a4 00a500a700a800ae00c800c900cf00d0 00d500e80161016301920193019c input props: < none> could not get driver version for /dev/input/mice, Not a typewriter add device 4: /dev/input/event1 name:"hisi_gpio_key.14" events: KEY (0001): 00720073 input props: < none> add device 5: /dev/input/event3 name:"hi3630_hi6401_CARD Headset Jack" events: KEY (0001): 0072007300e2 SW(0005): 00020004 input props: < none>
4、getevent 查看输入设备和查看事件
打印输出log日志,等待输入设备,我们触摸屏幕或是手机物理按键,便会看到这里的变化
[email protected]:/ $ getevent例如: /dev/input/event0: 0001 014a 00000001 /dev/input/event0: 0003 0000 000000f6 /dev/input/event0: 0003 0001 000002ed /dev/input/event0: 0003 0035 000000f6 /dev/input/event0: 0003 0036 000002ed /dev/input/event0: 0003 0032 00000001 /dev/input/event0: 0003 0039 00000000 /dev/input/event0: 0003 003a 00000043 /dev/input/event0: 0000 0002 00000000
他们四个参数对应的是device type code value
device:指的是处理触摸和按键的输入设备。
type:指的是事件类型,EV_SYN [0000] (同步事件),EV_KEY [0001] (按键事件),EV_ABS [0003] (绝对值事件)
code 指的是前面type代表的事件中支持的编码。
value 指的是值。
例如:需要模拟一次点击BACK键,模拟点击的功能通常都是使用 /dev/input/event0 这个输入设备,back键的类型为 0001(按键事件),BACK的编码为 0x9e 转换为十进制后即158
注意的是在getevent中code显示的是十六进制,而sendevent时需要用十进制
那我们输入如下命令即可模拟一次BACK键的按下和弹起:
adb shell sendevent /dev/input/event0 1 158 1 adb shell sendevent /dev/input/event0 1 158 0
5、input keyevent 命令
先列举 input keyevent 几个比较常用的code值:
input keyevent 3// Homeinput keyevent 4// Backinput keyevent 19//Upinput keyevent 20//Downinput keyevent 21//Leftinput keyevent 22//Rightinput keyevent 23//Select/Okinput keyevent 24//Volume+input keyevent 25// Volume-input keyevent 82// Menu 菜单
例如:
点击back键
[email protected]:/ $ input keyevent 3
input text 命令
输入框输入内容的。后面参数为 “ 字符串” ,例如输入” helloworld” 字符串
[email protected]:/ $ input text "helloworld!"
input tap 命令
模拟单击事件 后面参数为: x y ,例如点击(168,252)位置
[email protected]:/ $ input tap 168 252
input swipe 命令
此命令为滑动事件。例如:从 30 10 滑动到 30 100
[email protected]:/ $ input swipe 30 10 30 100
Android代码实现,注意需要root
private void execShellCmd(String cmd) { try { // 申请获取root权限,这一步很重要,不然会没有作用 Process process = Runtime.getRuntime().exec("su"); // 获取输出流 OutputStream outputStream = process.getOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream( outputStream); dataOutputStream.writeBytes(cmd); dataOutputStream.flush(); dataOutputStream.close(); outputStream.close(); } catch (Throwable t) { t.printStackTrace(); } }
execShellCmd("getevent -p"); execShellCmd("sendevent /dev/input/event0 1 158 1"); execShellCmd("sendevent /dev/input/event0 1 158 0"); execShellCmd("input keyevent 3"); //home execShellCmd("input text‘helloworld!‘ "); execShellCmd("input tap 168 252"); execShellCmd("input swipe 100 250 200 280");
< uses-permission android:name = "android.permission.INJECT_EVENTS"/>
【Android代码模拟物理屏幕点击事件】
推荐阅读
- android studio 导入第三方库的记录
- Android仿Win8界面的button点击
- android 选取部分 log 的两种方法
- Appium-Java滑动操作
- 14款用于音乐制作的最佳DAW软件合集(哪个最好())
- 11款最佳白板动画软件合集(你最喜欢哪个())
- 面向建筑师的13款最佳免费建筑软件合集
- 17个最佳Mp3拆分器工具(如何拆分和合并Mp3文件())
- Mac的7款最佳免费室内设计软件合集(哪个最好())