android 借助AccessibilityService实现模拟点击功能-微信助手(一)
demo地址
发此文还是想分享一些自己在android模拟点击这块的收获和想法
为什么开发模拟点击?
这是一个很好的问题。从我们开始开发微信相关的xposed模块的时候,就知道xposed这东西用着不踏实,时不时地微信给你来几个封号,搞的你的客户怨声载道。作为开发,面对销售显示出的大多是无奈、尴尬。
转而考虑市面上的类似于微商小蜜、微商工具箱一些微信辅助营销工具,准备开始模拟点击这方面的开发。
开始
首先新建一个service extends AccessibilityService,然后在manifest中注册,并且需要申明你采用的配置方案
<meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/accessibility" />
accessibility.xml:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeWindowStateChanged|typeNotificationStateChanged|typeViewTextSelectionChanged|typeViewClicked"android:accessibilityFeedbackType="feedbackGeneric"android:canRetrieveWindowContent="true"android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows"android:canRequestTouchExplorationMode="true"android:packageNames="com.tencent.mm"android:description="@string/as_description"android:notificationTimeout="100"/>
配置中的属性大家可以自行了解,特别需要说明的是 accessibilityEventTypes 这个属性,最好不好接收全部的行为类型,一个是日志不好看,一个是没有必要。常用的类型就上面几个就够了。其中typeWindowStateChanged中重点,他是activity切换的时候,或者一个dialog alert的时候触发的行为,常用来判断页面的切换,当前操作完成的依据。
其次是accessibilityFlags,这个属性需要设置flagRetrieveInteractiveWindows,为什么呢,当你用 mService.getRootInActiveWindow()
这个方法获取当前视图的最顶级window的方法,当两个activity切换的时候,中间有个渲染的时间差,要resume的activity附着的window还没渲染出来,你就调用了,就会返回null,但是加上这个属性,会返回手机底层的window,就是titleBar附着的那一层window,这样就避免了有时候会发生的空指针异常。
/*** Gets the root node in the currently active window if this service* can retrieve window content. The active window is the one that the user* is currently touching or the window with input focus, if the user is not* touching any window.public AccessibilityNodeInfo getRootInActiveWindow() {return AccessibilityInteractionClient.getInstance().getRootInActiveWindow(mConnectionId);
}
引导用户去打开无障碍-辅助服务
判断你的服务在不在运行?
这里有几个坑需注意,你要是简单的用获取你的应用的服务栈来判断服务在不在运行的方法是不可取的,因为即使是service在内存中运行,但是因为一些报错或者其他的原因,你的AccessibilityService服务可能会在AccessibilityManager里面消失掉。
这里我用的方法是在onServiceConnected 方法中先保存service实例,然后通过以下方法判断你的service可不可用
/*** 判断辅助服务是否正在运行*/
public static boolean isServiceRunning(AccessibilityService service) {if (service == null) {return false;}AccessibilityManager accessibilityManager = (AccessibilityManager) service.getSystemService(Context.ACCESSIBILITY_SERVICE);AccessibilityServiceInfo info = service.getServiceInfo();if (info == null) {return false;}List<AccessibilityServiceInfo> list = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);Iterator<AccessibilityServiceInfo> iterator = list.iterator();boolean isConnect = false;while (iterator.hasNext()) {AccessibilityServiceInfo i = iterator.next();if (i.getId().equals(info.getId())) {isConnect = true;break;}}if (!isConnect) {return false;}return true;
}
跳转到开启服务页面
/*** 打开辅助服务的设置*/
public static void openAccessibilityServiceSettings(Activity context) {try {Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);context.startActivity(intent);} catch (Exception e) {e.printStackTrace();}
}
接收事件
做了以上这些时候能 你就可以愉快的在你的service里面接收微信相关的控件出发的事件了
public class MainService extends AccessibilityService {@Override
protected void onServiceConnected() {super.onServiceConnected();AccessibilityHelper.mService = this;L.e("onServiceConnected");
}@Override
public void onAccessibilityEvent(AccessibilityEvent event) {L.e("当前事件:" + event.toString());}
}
下一篇将介绍对于接收事件的处理
android 借助AccessibilityService实现模拟点击功能-微信助手(一)相关推荐
- android如何实现微信功能吗,android 借助AccessibilityService实现模拟点击功能-微信助手(一)...
下集预告: android 借助AccessibilityService实现模拟点击功能-几个工具类(二)发此文还是想分享一些自己在android模拟点击这块的收获和想法 为什么开发模拟点击? 这是一 ...
- Android:辅助功能(模拟点击,模拟手势)入门基本学习
在 Android 中,有个非常强大的功能,那就是辅助功能.辅助功能是用于服务残障人士的.比如对于视障人士来说,辅助功能可以帮助他们读出屏幕上的文字或图片(阅读图片时会播放其 ContentDescr ...
- Android在任何地方模拟点击屏幕
要求: 在Android上按像素位置进行模拟屏幕点击,无论前台程序是什么(类似于按键精灵). 解决方案: 使用安卓中的linux命令行来进行模拟(可以完成目标但是不优雅). 前提知识: ADB中可以使 ...
- Android中模拟点击软件的实现原理探究
简介 按键触摸类模拟点击软件最早开始于PC时代,指的是可以通过设置.脚本控制等方式去实现模拟点击,解放双手,达到自动化操作的目的.在Android中,模拟点击对应的就是触发屏幕点击事件,多用于游戏中完 ...
- android root 模拟点击,免ROOT实现模拟点击任意位置
微信7.0版本之前抢红包插件点击基本上都借助AccessibilityService无障碍的performClick方法点击控件,不过7.0版本的微信的红包控件(view)没有id这一项了,所以per ...
- python | 明日方舟好友访问和线索传递模拟点击
在b站看到大佬https://www.bilibili.com/video/BV1jh411k7r9 用python实现了模拟器点击功能,并实现了公招的操作,因此自己也弄了一个好友访问的模拟点击功能. ...
- python语言重复运行_如何用python模拟点击进行重复话语?
从最简单的重复语句开始,之前运行过代码的小伙伴会发现,我们今天运行案例的结果会是一个语句的重复发送,也算是相较于之前的代码有了进阶的操作.这就是python模拟点击功能的一部分展现,等不及的小伙伴一起 ...
- Android 中 利用 AccessibilityService 辅助服务 模拟点击事件
在 Android 中想要执行一些模拟点击操作,在无法修改页面源码的情况下,通常只能使用 adb 和借助辅助功能两种方式. Adb 方式 借助 adb shell 的命令,我们可以使用下面的方式模拟一 ...
- Android 关于模拟点击和Hook框架的杂谈
1. 背景 就跟我们以前玩页游挂机一样,Android端也有游戏,而且样式繁多,如果重复的操作每次都要自己重复一遍操作,那不得烦死,所以就有了这篇文章,本文仅探讨方案,大家可以尝试.而且现在的模拟器( ...
最新文章
- docker image镜像的发布
- SQL Server DBA常见面试 笔试问题
- python函数参数那些事,关键字参数与位置参数
- 武汉大学计算机学院参考书目,2020武汉大学计算机与软件工程考研初试科目、参考书目及复试详情...
- Linux:rsync error: remote command not found (code 127) at io.c(226) [sender=3.1.2
- 九种设计模式在Spring中的应用
- 做生意,没亏过钱,自然也没赚过钱
- STL应用--SORT自定义排序
- 使用python对文档的所有词组统计
- opencv3 学习三 - 图像输入输出显示等
- 14个非常有用的jquery技巧,注意事项和最佳实践
- Python 爬虫天天基金数据——基金清单
- linux bind日志级别,Bind日志配置。
- SEGGER公司JlinkV9仿真器实现串口通讯VCOM和SWD调试双功能
- linux网络连接红叉号,win10能上网,但右下角宽带连接图标显示红叉的解决方法
- 复旦计算机教师,复旦教师:我有无人能及的相声天赋
- where online services go when they dieMichael Doi
- 浅谈主键索引与唯一索引
- Linux 内核 EISA 总线
- 1k文件夹快捷方式病毒清理