微信红包不错的分析: 附带源码 并包含了源码

参考: Android中微信抢红包助手的实现

(1) https://www.jianshu.com/p/19ddd41aa349

(2) http://blog.csdn.net/zero_zero_zero_zero/article/details/52008009

这个的源码和解释已经吃透了:
(3)http://www.cnblogs.com/cxk1995/p/6363574.html

只需要把

// private String LUCKEY_MONEY_RECEIVER = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI";

换成自己的:
private String LUCKEY_MONEY_RECEIVER = "com.tencent.mm.plugin.luckymoney.ui.En_fba4b94f";

或者:加上: private String LUCK_MONEY_RECEIVE_PREFIX="com.tencent.mm.plugin.luckymoney.ui";

然后:把

//                Log.e("spire==测试 哪个是开的ui名称:", className);  由于微信经常 变换开页面的ui名称,此处直接找到微信头部,进入
if(className.equals(LUCKEY_MONEY_RECEIVE)){
// if (LUCKEY_MONEY_RECEIVER.equals(className)) {
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
//开始抢红包
Log.e("spire点击了 之后红包进入 开的界面", className);
openRedPacket(rootNode);
}

改成:

//判断是否是显示‘开’的那个红包界面

                //判断是否是显示‘开’的那个红包界面

//                Log.e("spire==测试 哪个是开的ui名称:", className);  由于微信经常 变换开页面的ui名称,此处直接找到微信头部,进入
if(className.indexOf(LUCK_MONEY_RECEIVE_PREFIX)==0 && (!className.equals(LUCKEY_MONEY_DETAIL))){
// if (LUCKEY_MONEY_RECEIVER.equals(className)) {
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
//开始抢红包
Log.e("spire点击了 之后红包进入 开的界面", className);
openRedPacket(rootNode);
}

这是完整的代码:

package com.cxk.redpacket;

import android.accessibilityservice.AccessibilityService;
import android.app.KeyguardManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.text.TextUtils;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast; import java.util.List; /**
* 抢红包Service,继承AccessibilityService
*/
public class RedPacketService extends AccessibilityService {
/**
* 微信几个页面的包名+地址。用于判断在哪个页面
* LAUCHER-微信聊天界面
* LUCKEY_MONEY_RECEIVER-点击红包弹出的界面
* LUCKEY_MONEY_DETAIL-红包领取后的详情界面
*/
private String LAUCHER = "com.tencent.mm.ui.LauncherUI";
private String LUCKEY_MONEY_DETAIL = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI";
// private String LUCKEY_MONEY_RECEIVER = "com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI1";
// private String LUCKEY_MONEY_RECEIVER = "com.tencent.mm.plugin.luckymoney.ui.En_fba4b94f";
private String LUCK_MONEY_RECEIVE_PREFIX="com.tencent.mm.plugin.luckymoney.ui"; /**
* 用于判断是否点击过红包了
*/
private boolean isOpenRP; private boolean isOpenDetail = false; /**
* 用于判断是否屏幕是亮着的
*/
private boolean isScreenOn; /**
* 获取PowerManager.WakeLock对象
*/
private PowerManager.WakeLock wakeLock; /**
* KeyguardManager.KeyguardLock对象
*/
private KeyguardManager.KeyguardLock keyguardLock; @Override
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
switch (eventType) {
//通知栏来信息,判断是否含有微信红包字样,是的话跳转
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
List<CharSequence> texts = event.getText();
for (CharSequence text : texts) {
String content = text.toString();
if (!TextUtils.isEmpty(content)) {
//判断是否含有[微信红包]字样
if (content.contains("[微信红包]")) { Log.e("spire发现有红包的通知 [微信红包]", content);
if (!isScreenOn()) {
wakeUpScreen();
}
//如果有则打开微信红包页面
openWeChatPage(event); isOpenRP = false;
}
}
}
break;
//界面跳转的监听
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
String className = event.getClassName().toString();
//判断是否是微信聊天界面
if (LAUCHER.equals(className)) {
Log.e("spire 进入列表页 找红包", className); //获取当前聊天页面的根布局
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
//开始找红包
findRedPacket(rootNode);
} //判断是否是显示‘开’的那个红包界面 // Log.e("spire==测试 哪个是开的ui名称:", className); 由于微信经常 变换开页面的ui名称,此处直接找到微信头部,进入
if(className.indexOf(LUCK_MONEY_RECEIVE_PREFIX)==0 && (!className.equals(LUCKEY_MONEY_DETAIL))){
// if (LUCKEY_MONEY_RECEIVER.equals(className)) {
AccessibilityNodeInfo rootNode = getRootInActiveWindow();
//开始抢红包
Log.e("spire点击了 之后红包进入 开的界面", className);
openRedPacket(rootNode);
} //判断是否是红包领取后的详情界面
if (isOpenDetail && LUCKEY_MONEY_DETAIL.equals(className)) {
Log.e("spire领取之后的详细界面", className);
isOpenDetail = false;
//返回桌面
back2Home();
//如果之前是锁着屏幕的则重新锁回去
release();
}
break;
} } /**
* 开始打开红包
*/
private void openRedPacket(AccessibilityNodeInfo rootNode) {
if (rootNode != null) {
for (int i = 0; i < rootNode.getChildCount(); i++) {
AccessibilityNodeInfo node = rootNode.getChild(i);
Log.e("spire openRedPacket==", node.getClassName().toString());
if ("android.widget.Button".equals(node.getClassName())) {
Log.e("spire 成功点开le ", node.getClassName().toString()); node.performAction(AccessibilityNodeInfo.ACTION_CLICK); isOpenDetail = true;
}
openRedPacket(node);
}
}
} /**
* 遍历查找红包
*/
private void findRedPacket(AccessibilityNodeInfo rootNode) {
if (rootNode != null) {
//从最后一行开始找起
for (int i = rootNode.getChildCount() - 1; i >= 0; i--) {
AccessibilityNodeInfo node = rootNode.getChild(i);
//如果node为空则跳过该节点
if (node == null) {
continue;
}
CharSequence text = node.getText();
if (text != null && text.toString().equals("领取红包")) {
AccessibilityNodeInfo parent = node.getParent();
//while循环,遍历"领取红包"的各个父布局,直至找到可点击的为止
while (parent != null) {
if (parent.isClickable()) {
//模拟点击
Log.e("spire发现了列表页的红包 执行点击", text.toString());
parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);
//isOpenRP用于判断该红包是否点击过
isOpenRP = true; break;
}
parent = parent.getParent();
}
}
//判断是否已经打开过那个最新的红包了,是的话就跳出for循环,不是的话继续遍历
if (isOpenRP) {
break;
} else {
findRedPacket(node);
} }
}
} /**
* 开启红包所在的聊天页面
*/
private void openWeChatPage(AccessibilityEvent event) {
//A instanceof B 用来判断内存中实际对象A是不是B类型,常用于强制转换前的判断
if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) {
Notification notification = (Notification) event.getParcelableData();
//打开对应的聊天界面
PendingIntent pendingIntent = notification.contentIntent;
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
} /**
* 服务连接
*/
@Override
protected void onServiceConnected() {
Toast.makeText(this, "抢红包服务开启", Toast.LENGTH_SHORT).show();
super.onServiceConnected();
} /**
* 必须重写的方法:系统要中断此service返回的响应时会调用。在整个生命周期会被调用多次。
*/
@Override
public void onInterrupt() {
Toast.makeText(this, "我快被终结了啊-----", Toast.LENGTH_SHORT).show();
} /**
* 服务断开
*/
@Override
public boolean onUnbind(Intent intent) {
Toast.makeText(this, "抢红包服务已被关闭", Toast.LENGTH_SHORT).show();
return super.onUnbind(intent);
} /**
* 返回桌面
*/
private void back2Home() {
Intent home = new Intent(Intent.ACTION_MAIN);
home.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
home.addCategory(Intent.CATEGORY_HOME);
startActivity(home);
} /**
* 判断是否处于亮屏状态
*
* @return true-亮屏,false-暗屏
*/
private boolean isScreenOn() {
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
isScreenOn = pm.isScreenOn();
Log.e("isScreenOn", isScreenOn + "");
return isScreenOn;
} /**
* 解锁屏幕
*/
private void wakeUpScreen() { //获取电源管理器对象
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
//后面的参数|表示同时传入两个值,最后的是调试用的Tag
wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.FULL_WAKE_LOCK, "bright"); //点亮屏幕
wakeLock.acquire(); //得到键盘锁管理器
KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
keyguardLock = km.newKeyguardLock("unlock"); //解锁
keyguardLock.disableKeyguard();
} /**
* 释放keyguardLock和wakeLock
*/
public void release() {
if (keyguardLock != null) {
keyguardLock.reenableKeyguard();
keyguardLock = null;
}
if (wakeLock != null) {
wakeLock.release();
wakeLock = null;
}
} }

微信抢红包软件-android的更多相关文章

  1. Android-黑科技-微信抢红包必备软件

                        黑科技微信抢红包 介绍: 本节类容和技术无太大关系.主要是个人认为比較好玩,年关将至,对于新起之秀微信红包.绝对是过春节首选.看到就是赚到,速速围观下载.眼下仅 ...

  2. android黑科技系列——微信抢红包插件原理解析和开发实现

    一.前言 自从几年前微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  3. Android中微信抢红包插件原理解析和开发实现

    一.前言 自从去年中微信添加抢红包的功能,微信的电商之旅算是正式开始正式火爆起来.但是作为Android开发者来说,我们在抢红包的同时意识到了很多问题,就是手动去抢红包的速度慢了,当然这些有很多原因导 ...

  4. 微信5.0 Android版飞机大战破解无敌模式手记

    微信5.0 Android版飞机大战破解无敌模式手记 转载: http://www.blogjava.net/zh-weir/archive/2013/08/14/402821.html 微信5.0 ...

  5. 仿微信抢红包(js 转)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. 微信app支付(android端+java后台)

    本文讲解使用微信支付接口完成在android开发的原生态app中完成微信支付功能, 文章具体讲解了前端android如何集成微信支付功能以及后台如何组装前端需要支付信息, 话不多话, 具体看文章内容吧 ...

  7. 勤拂拭软件Android开发之旅(1) 之 Android 开发环境搭建

    勤拂拭软件工作室原创出品,欢迎转载,欢迎交流. 转载请注明原文:http://www.cnblogs.com/wangleiblog/p/6019063.html 勤拂拭软件Android开发之旅目录 ...

  8. React Native之支付集成(微信 支付宝)(ios android)

    React Native之支付集成(微信 支付宝)(ios android) 一,需求分析 1.1,app在线充值与提现 二,技术介绍与集成 2.1,微信支付 2.1.1,Android配置 详细配置 ...

  9. React Native之微信分享(iOS Android)

    React Native之微信分享(iOS Android) 在使用React Native开发项目的时候,基本都会使用到微信好友或者微信朋友圈分享功能吧,那么今天我就带大家实现以下RN微信好友以及朋 ...

随机推荐

  1. P2257 YY的GCD

    P2257 YY的GCD 题目描述 神犇YY虐完数论后给傻×kAc出了一题 给定N, M,求1<=x<=N, 1<=y<=M且gcd(x, y)为质数的(x, y)有多少对 k ...

  2. asp.net微信公众平台本地调试设置

    1.首先要开启内网穿透功能,我这边使用自己搭建的ngrok内网穿透服务(具体如何搭建ngrok内网穿透服务,另开一篇说) 2.开启内网穿透后,即可实现互联网访问 www.tbkmama.cn 指向 1 ...

  3. 【转】odoo学习之:Environment

    Environment类提供了对ORM对象的封装,同时提供了对注册类的访问,记录集的缓存,以及管理重计算的数据结构. 对于继承了Model的类来说可以直接通过self.env对Environment进 ...

  4. 绝地求生大逃杀BE启动失败,应用程序无法正常启动

    今日更新绝地求生大逃杀后部分客户反馈绝地求生点击启动提示BE安装,应用程序无法启动 问题原因:经过排查发现,客户开启过超级工作站运行过游戏,在系统镜像包中保留了旧版的BE服务,致使新版BE无法安装,冲 ...

  5. c# enum 解析

    解析定义的枚举 public enum OrderPaymentStatus { /// <summary> /// 未支付 /// </summary> [Descripti ...

  6. excell 导入 导出

    1.jar包 2.POIUtils工具类 package com.esstglobal.service.utils; import java.io.BufferedInputStream; impor ...

  7. hdu1847Good Luck in CET-4 Everybody!(sg函数)

    Good Luck in CET-4 Everybody! Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  8. flex布局笔记

    flex布局: 容器: 容器主轴方向: 项目的主轴对齐方式: space-between:两端对齐,项目之间的间隔都相等. space-around:每个项目两侧的间隔相等.所以,项目之间的间隔比项目 ...

  9. Leetcode-跳跃游戏

    跳跃游戏     给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] ...

  10. 关于javascript的一个小问题,请问有人看出啥问题吗?

    最近学习javascript,有一个问题挺奇怪的,先贴出代码: function binarySearch(){ var arr = [0,1,2,3]; var res = actbinarySea ...