关于抢红包的流程
1、在非微信消息列表界面,收到通知消息的事件,推断通知栏里的文本是否有[微信红包]的keyword,有则能够推断为用户收到红包的消息(当然,你能够有益发一条包含这个keyword的文本消息去整蛊你的朋友)。然后,我们就自己主动化触发这个消息的意图事件(Intent
);
2、在通知栏跳进微信界面后,是去到com.tencent.mm.ui.LauncherUI
这个Activity
界面。我们知道,红包的消息上,包含了keyword领取红包
或者View
的id
。那我们就依据这个keyword找到对应的View
,然后再触发ACTION_CLICK
(点击事件);
3、在点击红包后。会跳到com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI
这个拆红包的Activity
,当然老方法,找keyword拆红包
或id
,然后触发自己主动化点击事件。
这样就能够完毕整个自己主动化完毕抢红包的流程了,所以核心就是找keyword。然后模拟用户点击事件,就这么简单。下面具体说一下代码的实现。
下面是通过DDMS
工具里的Dump
View Hierarchy For UI Automator
去分析微信UI结构。
关键代码 package com.example.hook; import java.util.List; import android.accessibilityservice.AccessibilityService; import android.accessibilityservice.AccessibilityServiceInfo; import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.app.Notification; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.os.Build; import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityNodeInfo; @SuppressLint("NewApi") public class HookService extends AccessibilityService { private final String TAG = "HookService"; /** * 当通知栏改变或界面改变时会触发该方法 */ @Override public void onAccessibilityEvent(AccessibilityEvent event) { if (event == null) return; if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) { List<CharSequence> texts = event.getText(); if (!texts.isEmpty()) { for (CharSequence t : texts) { String text = String.valueOf(t); if (text.contains("[微信红包]")) {//获取通知栏字符,若包括 [微信红包] 则模拟手指点击事件 handleNotificationChange(event); break; } } } } /** * 以下内容能够借助 Dump View Hierarchy For UI Automator 去分析微信UI结构 */ if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { System.out.println("TYPE_WINDOW_STATE_CHANGED --> "+event.getClassName()); if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI" .equals(event.getClassName())) { // 点中了红包,下一步就是去拆红包 checkKey1(); } else if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI" .equals(event.getClassName())) { // 拆完红包后看具体的纪录界面 // nonething } else if ("com.tencent.mm.ui.LauncherUI".equals(event .getClassName())) { // 在聊天界面,去点中红包 checkKey2(); } } } private void checkKey1() { AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); if (nodeInfo == null) { Log.w(TAG, "rootWindow为空"); return; } List<AccessibilityNodeInfo> list = nodeInfo .findAccessibilityNodeInfosByText("拆红包"); //获取包括 拆红包 文字的控件,模拟点击事件,拆开红包 for (AccessibilityNodeInfo n : list) { n.performAction(AccessibilityNodeInfo.ACTION_CLICK); } } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void checkKey2() { AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); if (nodeInfo == null) { Log.w(TAG, "rootWindow为空"); return; } List<AccessibilityNodeInfo> list = nodeInfo .findAccessibilityNodeInfosByText("领取红包"); //找到聊天界面中包括 领取红包 字符的控件 if (list.isEmpty()) { list = nodeInfo.findAccessibilityNodeInfosByText("[微信红包]"); for (AccessibilityNodeInfo n : list) { Log.i(TAG, "-->微信红包:" + n); n.performAction(AccessibilityNodeInfo.ACTION_CLICK); break; } } else { // 最新的红包领起 for (int i = list.size() - 1; i >= 0; i--) { AccessibilityNodeInfo parent = list.get(i).getParent(); Log.i(TAG, "-->领取红包:" + parent); if (parent != null) { parent.performAction(AccessibilityNodeInfo.ACTION_CLICK); try { //依据 Dump View Hierarchy For UI Automator 能够知道得到的控件的.getParent().getParent().getParent().getParent() //才是要点击的根布局。 调用performAction(AccessibilityNodeInfo.ACTION_CLICK)触发点击事件 parent.getParent().getParent().getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK); System.out.println("click------"); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } break; } } } } public void handleNotificationChange(AccessibilityEvent event) { if (event == null) return; if (event.getEventType() != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) { return; } if (event.getParcelableData() instanceof Notification) { Notification notification = (Notification) event .getParcelableData(); if (!(event.getParcelableData() instanceof Notification)) { return; } notification = (Notification) event.getParcelableData(); PendingIntent pendingIntent = notification.contentIntent; try { pendingIntent.send(); //点击通知栏消息 System.out.println("send...."); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } } } @Override public void onInterrupt() { // TODO Auto-generated method stub } @Override public int onStartCommand(Intent intent, int flags, int startId) { // TODO Auto-generated method stub return super.onStartCommand(intent, START_STICKY, startId); } }
project下载链接 http://pan.baidu.com/s/1kTu4qAr