更多腾讯海量技术文章,请关注云加社区:https://cloud.tencent.com/developer/column
作者:逆流的鱼yuiop
红包精灵:https://github.com/hejunlin2013/RedPackage
效果图:
关键service代码:
实现原理
1.1 状态说明
private static final String WECHAT_OPEN_CH = "拆红包";
private static final String WECHAT_VIEW_SELF_CH = "查看红包";
private static final String WECHAT_VIEW_OTHERS_CH = "领取红包";
private static final String WECHAT_NOTIFICATION_TIP = "[微信红包]";
1.2 根据阶段选择不同的入口
在每次窗体状态发生变化后,根据当前所在的阶段选择入口。
屏幕内容检测和自动化点击的实现
和其他插件一样,这里使用的是Android API提供的AccessibilityService。这个类位于android.accessibilityservice包内,开启服务后就会自动做一些操作 像现在360的自动安装apk,也是开启了此服务。
AccessibilityService 服务在后台运行,等待系统在发生 AccessibilityEvent 事件时回调。这些事件指的是用户界面上发生的状态变化, 比如焦点变更、按钮按下等等。服务可以请求“查询当前窗口中内容”的能力。 开发辅助服务需要继承该类并实现其抽象方法。
2.1 配置AccessibilityService
在这个例子中,我们需要监听的事件是当红包来或者滑动屏幕时引起的屏幕内容变化,和点开红包时窗体状态的变化,因此我们只需要在配置XML的accessibility-service标签中加入一条
android:accessibilityEventTypes="typeWindowStateChanged|typeWindowContentChanged" 或在onAccessibilityEvent回调函数中对事件进行一次类型判断
final int eventType = event.getEventType(); if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED || eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) { // ... } 除此之外,由于我们只监听微信,还需要指定微信的包名
android:canRetrieveWindowContent="true" 其他配置请看代码。
2.2 获取红包所在的节点
首先,我们要获取当前屏幕的根节点,下面两种方式效果是相同的:
2.3 红包标识符
领取专属 10元无门槛券
私享最新 技术干货