Android中如何c 实现模拟点击人手指的点击

Android按键精灵 触摸精灵 触动精灵等软件模拟屏幕点击的基本原理 - 简书
Android按键精灵 触摸精灵 触动精灵等软件模拟屏幕点击的基本原理
有很多游戏玩家会用到按键精灵类软件,通过定制脚本来完成任务
也有很多人恶意作弊,通过定时脚本多线程触发第一时间抢到礼包 红包
有不少公司利用按键精灵自动化操作来完成各种商业目的
也有很多公司为了防住按键精灵等软件苦思各种对策
这篇文章的目的:纯讨论技术,不涉及灰色黑色产业,特此申明。
有哪一些方式可以实现?
Instrumentation? 需要系统签名,这就明你只能自行编译android系统。并且只能在你点击软件处于前台的时候才能处理,切换到别的app成为后台后就无法处理了。
IWindowManager? IWindowManager里面的模拟按键和触摸事件的api,这类方法在很早版本就被google屏蔽了,想尝试通过反射绕过java的权限限制非常麻烦,而且很可能最后又被系统权限给拦住了。
按键精灵类软件。它们都是在root环境下使用的,不需要系统签名,不需要运行在前台,完美满足通过代码来模拟点击的行为。
按键精灵的触摸原理分析
Android的touch系统架构简图(省略了一些过程,包括windowManagerService的一些过程,有兴趣同学可以查看相关实现)
观察整个Android的touch分发流程,在最开始的时候,用户触摸屏幕,对/dev/input/event写入信号量。Android系统循环读取里面的输出,在进行向下分发。那么我们站在黑客的角度思考下,按键精灵类软件是root过的,最好的方式就是自定义linux的触摸事件,不断发送到/dev/input/event,从而顺理成章的模拟了android系统的点击行为。
Linux命令 getevent sendevent 备好一台root过的android手机
一、getevent
在adb shell下面输入 getevent后,我们就能看到设备输入的硬件信息
dwlovehcy@bogon:~/OpenSource$ adb devices
List of devices attached
192.168.82.226:5555 device
dwlovehcy@bogon:~/OpenSource$ adb shell
shell@OnePlus2:/ $ getevent
add device 1: /dev/input/event8
"msm8994-tomtom-mtp-snd-card Headset Jack"
add device 2: /dev/input/event7
"msm8994-tomtom-mtp-snd-card Button Jack"
add device 3: /dev/input/event4
"qpnp_pon"
add device 4: /dev/input/event2
"STM VL6180 proximity sensor"
could not get driver version for /dev/input/mouse1, Not a typewriter
add device 5: /dev/input/event1
"fpc1020tp"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 6: /dev/input/event0
could not get driver version for /dev/input/mice, Not a typewriter
add device 7: /dev/input/event6
"gpio-keys"
add device 8: /dev/input/event3
"synaptics,s1302"
add device 9: /dev/input/event5
"synaptics,s3320"
尝试点击一次屏幕,看看shell的输出:
/dev/input/event5: 00001c
/dev/input/event5: 000001
/dev/input/event5: 000220
/dev/input/event5: 00059e
/dev/input/event5: 000006
/dev/input/event5: 000000
/dev/input/event5:
/dev/input/event5: 000000
/dev/input/event5: 000000
分析:此手机的event5负责了这个单点事件,这里面包含了1个touchdown、1到多个touchmove和1个touchup。
3 按一下手机的锁屏键:
/dev/input/event4: 000001
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
分析:此手机的event4负责了这个锁屏按钮,里面包含一个按键的按下和放开
从上面2处可以看到,我们只要定义出类似的动作,就可以完成Android的单点点击和锁屏 {具体实现请具体看下文}
4 getevent的详细用法
shell@OnePlus2:/ $ 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
其中-l可显示event的定义,把刚才的输入翻译成指令集,我们使用-l并点击一下屏幕获得输出:
/dev/input/event5: EV_ABS
ABS_MT_TRACKING_ID
/dev/input/event5: EV_KEY
/dev/input/event5: EV_ABS
ABS_MT_POSITION_X
/dev/input/event5: EV_ABS
ABS_MT_POSITION_Y
/dev/input/event5: EV_ABS
ABS_MT_TOUCH_MAJOR
/dev/input/event5: EV_SYN
SYN_REPORT
/dev/input/event5: EV_ABS
ABS_MT_TRACKING_ID
/dev/input/event5: EV_KEY
/dev/input/event5: EV_SYN
SYN_REPORT
点击一下锁屏键获得输出:
/dev/input/event4: EV_KEY
/dev/input/event4: EV_SYN
SYN_REPORT
/dev/input/event4: EV_KEY
/dev/input/event4: EV_SYN
SYN_REPORT
我们得到了更加详细的输出,而这些输出跟linux的input.h的定义方式一样,从字面上我们得出各种类型的含义,具体解释可以参考linux的input.h
二、sendevent
1、sendevent这个命令可以使我们可以向root手机发送触摸信号量,我们再次观察下刚才getevent情况下锁屏的输出:
/dev/input/event4: 000001
/dev/input/event4: 000000
/dev/input/event4: 000000
/dev/input/event4: 000000
命令行输入sendevent -h:
1|shell@OnePlus2:/ $ sendevent
use: sendevent device type code value
命令行提示我们需要发送device type 和 取值,根据观察device type就是/dev/input/event4, 而value就是后面的例如:000001(我们可以翻译成十进制来使用)
实际操作:
shell@OnePlus2:/ $ sendevent
/dev/input/event4 1 116 1
shell@OnePlus2:/ $ sendevent
/dev/input/event4 0 0 0
shell@OnePlus2:/ $ sendevent
/dev/input/event4 1 116 0
shell@OnePlus2:/ $ sendevent
/dev/input/event4 0 0 0
屏幕并没有被锁屏了,why,因为咋们输入速度不够快,中间有别的事件发生了或者超过了一系列时间的最大间隔~~~
咋们直接一起执行这4个命令:
shell@OnePlus2:/ $ sendevent
/dev/input/event4 1 116 1 & /dev/input/event4 0 0 0 & /dev/input/event4 1 116 0 &/dev/input/event4 0 0 0
屏幕顺利被锁定,HOHO,我们完成了最简单的一个HACK
2、测试下触摸,选择桌面上一个app,打开getevent,记录下这个过程中的信号量
/dev/input/event5: 000030
/dev/input/event5: 000001
/dev/input/event5: 000225
/dev/input/event5: 0003b4
/dev/input/event5: 000000
/dev/input/event5:
/dev/input/event5: 000000
/dev/input/event5: 000000
回到桌面,开始用sendevent来执行,大家可以动手自己把这段用sendevent组合起来,一样如预期,打开了刚才那个app。
Good job,我们能控制Android的单点点击了
如何完成各种Android机型的适配?
1. 在完成上面的过程后,有想彻底搞懂的同学你会有以下几个问题要问:
a、各种android手机对应的单点event居然不一样,甚至同厂家也是,怎么处理?
b、android手机多点触摸怎么处理?
c、 android手机滑动怎么处理?
等等各种问题
2. 统一为这些问题做一个解答:
仔细阅读linux input.h,里面定义了所有触摸定义,包括最基本的触摸坐标,压力值,触摸面积,按键,物理键,虚拟键盘等。然后继续对比getevent的输出。比如从上面的例子你就可以发现ABS_MT_POSITION_X,ABS_MT_POSITION_X是触摸的x和y坐标的代表位,并且他们值一定是0x35和0x36
每个手机都有不同的/dev/input/event,你需要找到一种探测方式,逐一探测所有event锁定你需要的event
Android有好几种多点触摸协议,同二你可以在源码中找到实现方式,滑动也是如此
其他:如何应对按键精灵等软件作弊
纯从技术层面,不考虑其他辅助策略,现有的按键精灵等软件在对外的接口中只注重了对一部分参数的关注(点击坐标,位置,滑动时间等),而另一些参数没有做过处理,用代码点出来跟真人点击会产生很大的区别。抓取此行为可以提高对按键精灵类软件识别准确率
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
对于安卓系统来说,模拟用户操作是一件很危险的事情,因此到目前我所使用过的系统(Android 7以下)均没有开放模拟触控权限。本文总结了目前已知可行的跨进程触控操作方法,基本都需要Root权限或系统签名。 一、Instrumentation框架 | 项目 | 描述 || -...
摘要 在本文中我们将证明,在现今许多手机模型上都有的hover(floating touch,悬浮触控)技术可以被恶意软件滥用,用来记录系统范围内的所有触屏输入。通过这种攻击,运行在Android系统上的恶意软件可以获取用户的敏感信息诸如密码、PIN,记录用户的社交,掌握用...
先说一下这篇文章里面的内容:TCP 客户端, 自定义对话框, 自定义按钮, ProgressBar竖直显示, 重力感应传感器,手机返回键新开启界面的问题(返回上次的界面),数据保存 软件的通信是配合 http://www.cnblogs.com/yangfengwu/p/7...
胡连海九月份的七次,读书打卡。我今天读的书是,《吹小号的天鹅》。172页到194页最后,讲的是老天鹅路易斯的爸爸,冒着生命危险。还上了小号钱。我最喜欢的句子是。他要小号儿保持清洁,花上好几个钟头。用它翅膀羽毛的尖尖擦它。它活一天就感谢他爸爸一天。这位勇敢的天鹅老爸甘冒生命危...
真自由训练营笔记内容 -01- 先问大家一个问题: 你平时遇见问题的时候,大约会出现哪些情况呢? 大家有没有发现,我们面对不同的问题时,状态是不一样的。 永澄老师做了这样的一张图,总结了我们面对不同问题时的状态: 横轴表示的是我们的能力。 1)当我们的能力可以解决问题时,我...
你是千堆雪,我是长街 (一) “嗡嗡嗡……嗡……嗡嗡嗡……嗡……” “嗡嗡嗡……嗡……嗡嗡嗡……嗡……” 电话?卧槽都几点了,我伸出手去摸枕头边上正震个不停的手机。名字也没看清直接接通了电话,“喂?” “她要结婚了”,电话里传来淡淡的略带压抑的声音。 “啥?”我一时没听清是...
——学习感悟十九大精神
阳光为墨天作纸,绘中华美景;岁月如弦地如琴,奏盛世强音,党的十九大像舵手,掌握着航行的方向;若灯塔,指引着我们前行。作为祖国的孩子,我们当代大学生更应有张横渠所言的“为天地立心,为生民立命,为往圣继绝学,为万世开太平”的远大抱负。...
眼眸凝液,欲哭还休,望星空,愁云覆去笑语,知否?何时旧月换新月。 古城依旧,换了朱颜,去年偶识君,背影依旧住我心,时时传话,却道伊人爱帝都,何况边塞人尔?android开发模拟click点击事件
在android开发时,button事件一般是需要与用户交互的,即人机交互事件,用户点击时有事件响应,但有时,我们也许会需要模拟点击事件,即不是用户点击,而是程序内部使响应click事件,这时我们可以使用performClick()方法了,performClick()方法即是模拟用户点击事件。
public class MainActivity extends Activity {
private Button btn1;
private Button btn2;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Toast.makeText(getApplicationContext(), "I am btn1", Toast.LENGTH_LONG).show();
btn2.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
btn1.performClick();
没有更多推荐了,Android 下触摸屏模拟鼠标的实现分析_论文_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Android 下触摸屏模拟鼠标的实现分析
中国最大最早的专业内容网站|
总评分0.0|
试读已结束,如果需要继续阅读或下载,敬请购买
定制HR最喜欢的简历
你可能喜欢拒绝访问 | wangbaiyuan.cn | 百度云加速
请打开cookies.
此网站 (wangbaiyuan.cn) 的管理员禁止了您的访问。原因是您的访问包含了非浏览器特征(e243b3-ua98).
重新安装浏览器,或使用别的浏览器Android实现类似3D Touch菜单功能
转载 &更新时间:日 11:49:47 & 作者:Lin_Zero
这篇文章主要为大家详细介绍了Android实现类似3D Touch菜单功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
在开发中,我们经常遇到需要菜单功能的实现,我们经常会参考其他人的优秀设计。比如3D Touch菜单,作为iphone6和iphone6s上引人注目的新功能。现在,我们希望尽力来模仿这种菜单设计,尽力,因为系统的差异,会导致很多东西实现起来有难度。
想要尽力模仿这种菜单,经过分析,我觉得主要实现以下几个点:
1)菜单的出现方式,在ios上,方式是用户用手指用力按下,然而在Android上,受限于硬件,我们无法捕捉用力按压这种动作,所以,我改用另一种比较次的方式,长按弹出,捕捉手指长按动作。
2)菜单的界面上,需要处理背景模糊效果。
3)菜单的触摸事件处理,我们看到,手指长按之后,菜单出现,这时候手指不离开屏幕,滑动到菜单某个选项,再抬起,这时候这个选项会相应。
背景模糊处理
经过一番调研,除了调用github上面大神的各种绘图效果库,我们想要自己实现大概有两个思路。
RenderScript方案
RenderScript是由Android3.0引入,用来在Android上编写高性能代码的一种语言。优点:使用方便,Android官方API自带,而且性能处理效果极好,缺点:需要API17以上。
使用非常简单,我们只需要获取RenderScript的实例,传入模糊图像需要的参数
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
public Bitmap getRenderScriptBitmap(Context context, int radius, Bitmap bitmapOriginal) {
RenderScript rs = RenderScript.create(context);
final Allocation input = Allocation.createFromBitmap(rs, bitmapOriginal);
final Allocation output = Allocation.createTyped(rs, input.getType());
final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
script.setRadius(radius);
script.setInput(input);
script.forEach(output);
output.copyTo(bitmapOriginal);
rs.destroy();
return bitmapO
Java代码层实现方案
通过java层代码也可以实现图像的模糊处理,github大神已经为我们实现了这种。
通过FastBlur算法实现图片模糊,没有版本兼容问题,但是如果我们需要模糊的图像不小的时候,我们会发现模糊图像需要的时间远远超过了我们能够接受的范围,如果加载大图的话,那情况就更加糟糕了。一个比较好的处理方式是,在图片进行模糊处理之前,先对图像进行压缩,在图片模糊处理完毕之后,再按照原大小放大,这样就能有效降低模糊处理的耗时。
这里我们做一个版本判断
if (android.os.Build.VERSION.SDK_INT &= Build.VERSION_CODES.JELLY_BEAN_MR1) {
mIBlurry = BlurryFactory.createRenderScript();
mIBlurry = BlurryFactory.createFastBlur();
触摸事件的处理
先来说说模糊层如何出现,肯定是要实现一个全屏效果,关于全屏效果,我们可以通过Dialog,悬浮窗,透明的Activity,或者在DectorView中插入覆盖父布局的视图,这四种方式都可以实现全屏效果,这里,我们选用在DectorView中插入视图的方式来实现。
如何实现呢?
* 挂载到某个Activity的最顶层
* @param activity
private void attachActivity(Activity activity) {
ViewParent parent = getParent();
if(parent != null && parent instanceof ViewGroup) {
ViewGroup parentView = (ViewGroup)
parentView.removeView(this);
FrameLayout decor = (FrameLayout)activity.getWindow().getDecorView();
FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
decor.addView(this, lp);
前面提到,手指长按,在菜单弹出之后,我们在手指不抬起的情况下,可以选择菜单选项。这样听起来可能有些难以理解,我们都看过很多大神写的View的触摸事件解析,也有自己去研读源码,都对触摸事件传递有一定的了解。
一般情况下,当我们长按界面里的某个View,之后在我们手指抬起之前,所有的触摸事件都会交由这个View来处理,也就是targetView(当某个View消费了触摸事件,那么它就会被设置为targetView,并且接收接下来传递的触摸事件)。那么我们如何在手指不抬起的情况下,让刚刚出现模糊层视图来接管接下来的手指滑动,也就是ACTION_MOVE和ACTION_UP事件呢?
经常一番思考,我想到了一种比较委婉的方式…
我们都知道手指抬起的时候,DecorView以及其子视图都会接收到一个ACTION_UP的触摸事件,这个事件会告诉DecorView,这个手指触摸系列动作已经结束,那么方法来了,我们并不需要手指真的抬起来,只需要模拟一个手指抬起的动作,也就是自己发送一个ACTION_UP事件,就可以让DecorView接收到ACTION_UP事件,然后重新寻找targetView,也就是新出现的模糊层视图,这时候我们再模拟发送一个ACTION_DOWN事件。
* 转移触摸事件
private void transferTouchEvent(final Activity activity) {
postDelayed(new Runnable() {
public void run() {
activity.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 0f, 0f, 0));
activity.getWindow().getDecorView().dispatchTouchEvent(MotionEvent.obtain(SystemClock
.uptimeMillis(), SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, 0f, 0f, 0));
最后的效果图如下,由于时间比较少,有很多地方没有好好完善,菜单的出现角度以及菜单的样式不够美观,同时没有判断菜单出现在ICON上面还是下面。
github项目地址:。
效果思路仍不够完善,待更好的方案。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具

我要回帖

更多关于 手指点击图标素材gif 的文章

 

随机推荐