您查询的关键词是:微信   抢红包源码 
下面是原始网址 http://www.androidchina.net/3393.html 在 2020-03-21 16:35:57 的快照。

360搜索与该网页作者无关,不对其内容负责。

微信抢红包源码 Android开发中文站
最新消息:欢迎访问Android开发中文站!商务联系微信:loading_in

微信抢红包源码

开发进阶 AndroidChina 13885浏览 1评论

关于抢红包的流程

1、在非微信消息列表界面,收到通知消息的事件,判断通知栏里的文本是否有[微信红包]的关键字,有则可以判断为用户收到红包的消息(当然,你可以故意发一条包括这个关键字的文本消息去整蛊你的朋友)。然后,我们就自动化触发这个消息的意图事件(Intent);

2、在通知栏跳进微信界面后,是去到com.tencent.mm.ui.LauncherUI这个Activity界面。我们知道,红包的消息上,包括了关键字领取红包或者Viewid,那我们就根据这个关键字找到相应的View,然后再触发ACTION_CLICK(点击事件);

3、在点击红包后,会跳到com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI这个拆红包的Activity,当然老方法,找关键字拆红包id,然后触发自动化点击事件。

这样就可以完成整个自动化完成抢红包的流程了,所以核心就是找关键字,然后模拟用户点击事件,就这么简单。以下详细说一下代码的实现。

以下是通过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);
}
}

工程下载链接   http://pan.baidu.com/s/1kTu4qAr

转载请注明:Android开发中文站 » 微信抢红包源码

您必须 登录 才能发表评论!

网友最新评论 (1)

  1. 感谢分享,分析的很棒
    wussrc2017-02-06 13:57