党薇 2018-03-09
为了应对领导在群里时不时的一个红包,写一个抢红包的应用迫在眉睫了。之前由于没有自动抢红包错失了100RMB+的红包啊!
先来整理下思路。要实现抢红包,那么就要在红包来的时候去打开微信,执行点击的动作。被点击的控件肯定是带有红包关键字的。打开红包后,还需要去点击一下打开。
为了实现上面的一系列步骤,方法有两种。
从framwork进行修改。这种方式适合于自制rom。如手机厂商多采用这种方法。有个同事就通过这方法实现了红包功能。
就只能通过google 提供了一个辅助服务类了。该类可以监听通知、监听窗口变化,模拟点击等功能。该文就采用辅助服务类。
通过配置manifest文件就可以使用辅助服务了。
<service android:name=".RedService" android:enabled="true" android:exported="true" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"> <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/red_service_config" /> </service>
该服务可以进行配置,配置如下:
配置好后,该服务就可以使用了。可以通过一个按钮引导用户去开启这个服务
因为这个服务在系统设置里,所以通过点击去打开系统设置。然后就可以开启次服务。
接下来就是重点了。
首先需要去继承一个AccessibilityService 。
需要去重写他的两个方法。onAccessibilityEvent方法用来接收服务监听的事件,此处为通知和窗口变化。
现在先来看看 通知来的时候如何处理:
在打开微信后,会发生窗口状态变化。这个时候该事件将会被监听。
此处要说的是微信的聊天界面和聊天列表的界面其实是在一个activity。都为
com.tencent.mm.ui.LauncherUI。
而且聊天界面是整个Activity contentView的父VIEW。通过解析页面可以轻易的发现。
再新打开的页面上,通过辅助类提供的方法对节点进行遍历。
通过 AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); 获取跟节点,同时也可以通过getchirld 方法来看看他的子节点。
在android.widget.FrameLayout下一共有8个子Node,不一一列举。上面列举了一个叫com.tencent.mm.ui.mogic.WxViewPager的view这个view 就是我们的聊天列表。
其余7个分别是搜索、更多、微信、通信录等。
&emsp;当我们在聊天页面点击红包后,会弹出一个为打开的红包或者可能提示红包已到期。重点说说正常情况下红弹出红包的情况。弹出红包将会触发一个event,该event为窗口变化,由之前的窗口变为了com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI。
这时候,我们可以继续利用对节点的遍历来实现点击的动作。代码如下:
至此,基本自动抢红包的功能都完成了。为了保证程序的健壮性,还需要对抢红包的失败的情况进行处理。