Android模拟屏幕点击input tap替代解决方案
动机解释
本来直接使用 adb shell -> input 即可模拟 键盘事件,触屏事件keyevent ,text,tap
但是手上的这台目标Android机4.0.3系统的input只支持text和keyevent,不支持tap,无法模拟触屏点击事件.
usage: input [text|keyevent]
input text <string>
input keyevent <event_code>
于是开始寻找模拟触屏的替代解决方案.
最新的Android API.24模拟器的input支持范围很广:
Usage: input [<source>] <command> [<arg>...]
The sources are:
keyboard
mouse
joystick
touchnavigation
touchpad
trackball
dpad
stylus
gamepad
touchscreen
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll (Default: trackball)
参考源码
- radhoo/android-event-injector: A JNI approach to injecting events (keys and touch) on rooted Android
参考资料
- Event 原语 Android 多点触摸接口详解 - arm-linux - 博客园
- Programmatically Injecting Events on Android - Part 1 - PocketMagic
- Programmatically Injecting Events on Android - Part 2 - PocketMagic
- Android 模拟系统事件(三) - banketree - 博客频道 - CSDN.NET
- Android 模拟系统事件(二) - banketree - 博客频道 - CSDN.NET
- Android 模拟系统事件(一) - banketree - 博客频道 - CSDN.NET
- Android sendevent/getevent 用法 - kickxxx的专栏 - 博客频道 - CSDN.NET
- android高分段进阶攻略(4)android模拟点击 - aimn的开源库 - 博客频道 - CSDN.NET
- 记录小米设备事件获取 - banketree - 博客频道 - CSDN.NET
事件回放方式
- 新建一个.sh脚本(换行符必须为UNIX.LF)
- 将捕获到的指定操作的所有event放入脚本
- 将event里的数值全部转换为10进制
- 在全部event前都加上
sendevent命令
sendevent /dev/input/event1 1 330 1
- 把脚本导入设备
adb push x.sh /data/local/tmp/x.sh
- 执行脚本
adb shell -> su -> sh /data/local/tmp/x.sh
- 观察操作是否正确回放.
系统键盘,触摸事件捕获方式
- Root后的设备
- adb shell -> su -> getevent
- 在手机屏幕点击某个指定的X,Y坐标位置
在命令行窗口可见监听到很多event,类似以下内容
add device 1: /dev/input/event3
name: “bma222e”
add device 2: /dev/input/event2
name: “headset-keyboard”
add device 3: /dev/input/event1
name: “ft5x0x_ts”
add device 4: /dev/input/event0
name: “sprd-keypad”
/dev/input/event1: 0001 014a 00000001
/dev/input/event1: 0003 0030 000000c8
/dev/input/event1: 0003 0035 00000015
/dev/input/event1: 0003 0036 000002ff
/dev/input/event1: 0003 0032 00000001
/dev/input/event1: 0000 0002 00000000
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0003 0030 000000c8
/dev/input/event1: 0003 0035 00000015
/dev/input/event1: 0003 0036 000002ff
/dev/input/event1: 0003 0032 00000001
/dev/input/event1: 0000 0002 00000000
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0001 014a 00000000
/dev/input/event1: 0000 0000 00000000event [type] [code] [value]
(不同系统版本的手机监听到的内容可能不太一样.单点触控,和多点触控设备事件不一样.)
event0:name包含keypad字符串,键盘设备
event1:name包含ts字符串,触摸屏设备
event2:name包含headset,耳机相关控制设备(猜的)- 通过单变量操作原则,多监听几个类似操作的event
- 通过多次回放捕获到的event然后凭经验剔除非关键event
提取”通用event”,”关键event“,类似以下内容
/dev/input/event1: 0001 014a 00000001
/dev/input/event1: 0003 0030 000000c8
/dev/input/event1: 0003 0035 000000f0
/dev/input/event1: 0003 0036 00000384
/dev/input/event1: 0003 0032 00000001
/dev/input/event1: 0000 0002 00000000
/dev/input/event1: 0000 0000 00000000
/dev/input/event1: 0001 014a 00000000
/dev/input/event1: 0000 0000 00000000关键event红色部分,分别试验出来对应的是X,Y坐标地址.可把16进制换算成10进制,得到具体数值.
最小事件集序列尝试
经过实际真机测试,这个最小序列无法正确触发.看来还是没掌握底层原理.
下面是两点触摸支持的最小事件集序列:
ABS_MT_TOUCH_MAJOR 0x30
ABS_MT_POSITION_X 0x35
ABS_MT_POSITION_Y 0x36
SYN_MT_REPORT 0x02 //上报第一个点
ABS_MT_TOUCH_MAJOR
ABS_MT_POSITION_X
ABS_MT_POSITION_Y
SYN_MT_REPORT //上报第二个点
SYN_REPORT 0x00 //开始动作
Android模拟屏幕点击input tap替代解决方案的更多相关文章
- [Android]通过adb shell input上报命令模拟屏幕点击事件【转】
本文转载自:http://blog.csdn.net/yuanzihui/article/details/52871652 常用的 input上报命令: input text 1234 实际向界面注入 ...
- Appium连接夜神模拟器,模拟手势点击(tap)
# -*- coding:utf-8 -*- from appium import webdriver from time import sleep desired_caps ={ 'platform ...
- Android+appium +python 点击坐标tap方法的封装
当常使用的查找点击元素的方法name.id.classname等无法使用时,我们将会采取坐标的点击来实现操作,同样存在一个问题,当手机的分辨率.屏幕大小不一致时,坐标的定位也会不同,因此将采用相对坐标 ...
- Android 中屏幕点击事件的实现
在Android中如何用代码触发按钮点击事件?我想要触发代码执行按钮点击.实现对于单击按钮事件的模拟,触发单击按钮进入另一个界面. 就是声明一下什么moonlightcheese被声明了:在andro ...
- Android代码模拟物理、屏幕点击事件
一.应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 private void simulateClick(View view, float x, float y) { long do ...
- appium+python自动化37-adb shell模拟点击事件(input tap)
前言 appium有时候定位一个元素很难定位到,或者说明明定位到这个元素了,却无法点击,这个时候该怎么办呢? 求助大神是没用的,点击不了就是点击不了,appium不是万能的,这个时候应该转换思路,换其 ...
- 我的Android进阶之旅------>Android中通过adb shell input来模拟滑动、按键、点击事件
今天在维护公司的一个小项目的时候,发现按公司手机的某个物理按键,激活相应的Service后,会在屏幕上模拟的点击了屏幕的某个坐标点.好家伙,原来是之前该项目的版本是按这个物理按键后,会弹出一个对话框, ...
- appium+python自动化-adb shell模拟点击事件(input tap)
前言 appium有时候定位一个元素很难定位到,或者说明明定位到这个元素了,却无法点击,这个时候该怎么办呢? 求助大神是没用的,点击不了就是点击不了,appium不是万能的,这个时候应该转换思路,换其 ...
- adb shell模拟点击事件(input tap)
前言:appium定位也不是万能的,有些元素还是定位不到,这个时候只能换一个方式定位了,可以使用这个adb shell模拟点击. 1.input可以实现的功能 输入文本信息:input text gu ...
随机推荐
- AC日记——Broken BST codeforces 797d
D - Broken BST 思路: 二叉搜索树: 它时间很优是因为每次都能把区间缩减为原来的一半: 所以,我们每次都缩减权值区间. 然后判断dis[now]是否在区间中: 代码: #include ...
- 让指定JS出现智能提示
大家都知道,在Asp.net MVC中,引入了CSS,JS捆绑优化这个好东东.但是,你会发现,运用了这个捆绑优化后,或者引用了模板后,在模板中引用了JS的文件后,在页面中编辑JS文件后,却不能利索地出 ...
- VS2010/2012Web负载测试
原文地址:http://www.cnblogs.com/aarond/archive/2013/04/18/performance.html VS自带的Web负载测试真的很大程度上能和专业的loadr ...
- HDU 2546.饭卡-动态规划0-1背包
饭卡 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- Mybatis批量添加,删除与修改
1.批量添加元素session.insert(String string,object O) public void batchInsertStudent(){ List<Student> ...
- 线段树【p2629】 好消息,坏消息
顾z 你没有发现两个字里的blog都不一样嘛 qwq 题目描述-->p2629 好消息,坏消息 历程 刚开始看到这个题,发现是需要维护区间和,满心欢喜敲了一通线段树,简单debug之后交上去 \ ...
- 几个有用的PHP.ini配置项-路径和目录
几个有用的PHP.ini配置项-路径和目录 路径和目录1.include_path = string作用域:PHP_INI_ALL默认值:NULL此参数指定的路径是include().require( ...
- SQL Server判断某个字段是否包含中文/英文字符/数字
原文:SQL Server判断某个字段是否包含中文/英文字符/数字 因最近在清理系统中的脏数据,需要查询某个字段是否包含中文/英文字符/数字的数据, 比较简单,仅以此篇博客做一个简单总结,方便以后查阅 ...
- pr_debug、dev_dbg等动态调试一
内核版本:Linux-3.14 作者:彭东林 邮箱:pengdonglin137@163.com pr_debug: #if defined(CONFIG_DYNAMIC_DEBUG) /* dyna ...
- 愤怒的TryCatch
本文地址:http://www.cnblogs.com/likeli/p/5719230.html 前言 本文不提供任何搭梯子之类的内容,我在这里仅仅讨论网络爬虫遇到的IP封杀,然后使用Tor如何对抗 ...