微信QQ抢红包,相信随便搜索一下,结果真不少。我这里的版本是尽可能的完善到完美。
不错,我们都是用AccessbilityServcie类来处理。在使用之前先生成它的配置文件,在res目录下创建一个xml文件夹,创建这个配置文件
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:canRetrieveWindowContent="true"
android:description="@string/fetch_luncky_money"
android:notificationTimeout="100"
android:packageNames="com.tencent.mm,com.tencent.mobileqq" />
这里,我们需要监听的微信和QQ的包名都写上去。
然后创建Service类继承AccessbilityServcie类,然后在Manifest中声明并引用配置。
<service
android:name=".RedPocketService"
android:enabled="true"
android:exported="true"
android:label="@string/app_name"
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_pocket" />
</service>
重点是在我们自己创建的Service类继承Accessiblity类中,重写onAccessibilityEvent的方法,这里我们希望利用这个事件去分析,到底鉴定到了什么,我们需要把这些内容打印出来
Log.e(TAG,"《=======================================================");
Log.e(TAG,"【packagename】: "+event.getPackageName());
Log.e(TAG,"【classname】: "+event.getClassName());
Log.e(TAG,"【source】: "+event.getSource());
Log.e(TAG,"【evenType】: "+AccessibilityEvent.eventTypeToString(event.getEventType()));
Log.e(TAG,"========================================================》");
通过上面答应出来的evenType,就可以看到当我们操作微信/QQ的时候说触发的时间,以及相应的一些类名,控件等。比如我们需要拆开红包这个例子:
AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
if (nodeInfo != null) {
List<AccessibilityNodeInfo> list = new ArrayList<AccessibilityNodeInfo>();
//中文版
list.addAll(nodeInfo.findAccessibilityNodeInfosByText("拆红包"));
//英文版
list.addAll(nodeInfo.findAccessibilityNodeInfosByText("Open"));
//部分中文版text上面没有任何字
if(list.size()==0) {
int nodeSize = nodeInfo.getChildCount();
for (int i = 0; i < nodeSize; i++) {
if (nodeInfo.getChild(i).getClassName().toString().equals("android.widget.Button")) {
list.add(nodeInfo.getChild(i));
}
}
}
if(list!=null && list.size()!=0)
list.get(0).performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
思路是通过getRootInActiveWindow()来获取当前活动页面的所有ui控件的节点,在通过节点的findAccessibilityNodeInfosByText就是根据控件的属性text去寻找到相应的节点,然后通过节点在进行一个模拟点击。不要企图用findAccessibilityNodeInfosByViewId去选择ui控件,因为编译后的id跟我们平常写代码定义的id不太一样,这里的id是会变动的,它相当于我们R.java文件所指向的id地址。
利用Android SDK目录下的tools工具uiautomatorviewer去分析ui上面的控件类型和相应的text属性上面的文字信息。
当然,一般搜到的晚上的代码只有通知消息,但是我希望当停留在软件聊天的时候依然可以抢红包,然后发现了一些事件被触发时候就可以调用到,比如在微信聊天时候,聊天记录所在的listview会发生滚动,则,我们需要监听这个listview的滚动时间,再做一个红包判断处理。
具体代码见
https://github.com/arjinmc/GrabLuckyMoney