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

参考: 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. c语言指针的指针

    c语言在函数传递时常常使用如下的形式. void get(int **p) 对于这个形式,我想过为什么不能够使用 *p 作为形参呢.下面我们看一下代码和执行结果 void get(int **p) { ...

  2. 变分自编码器(Variational auto-encoder,VAE)

    参考: https://www.cnblogs.com/huangshiyu13/p/6209016.html https://zhuanlan.zhihu.com/p/25401928 https: ...

  3. [BZOJ4552][Tjoi2016&Heoi2016]排序(二分答案+线段树)

    二分答案mid,将>=mid的设为1,<mid的设为0,这样排序就变成了区间修改的操作,维护一下区间和即可 然后询问第q个位置的值,为1说明>=mid,以上 时间复杂度O(nlog2 ...

  4. 笔记-python-float(‘inf’)

    笔记-python-float(‘inf’) 看算法时发现了flaot(‘inf’). Python中可以用如下方式表示正负无穷: float("inf"), float(&quo ...

  5. 笔记-jinja2语法

    笔记-jinja2语法 1.      基本语法 控制结构 {% %} 变量取值 {{ }} 注释 {# #} 2.      变量 最常用的是变量,由Flask渲染模板时传过来,比如上例中的”nam ...

  6. 推荐 的FPGA设计经验(1)组合逻辑优化

    主要内容摘自Quartus prime Recommended Design Practices For optimal performance, reliability, and faster ti ...

  7. python中自定义超时异常的几种方法

    最近在项目中调用第三方接口时候,经常会出现请求超时的情况,或者参数的问题导致调用异代码异常.针对超时异常,查询了python 相关文档,没有并发现完善的包来根据用户自定义的时间来抛出超时异常的模块.所 ...

  8. WPF程序,运行时,结束时,要运行的操作(自动保存,检查单程序)

    /// <summary> /// App.xaml 的交互逻辑 /// </summary> public partial class App : Application { ...

  9. Redis系列一 Redis安装

    Redis系列一    Redis安装 1.安装所使用的操作系统为Ubuntu16.04 Redis版本为3.2.9 软件一般下载存放目录为/opt,以下命令操作目录均为/opt root@ubunt ...

  10. 数据库c3p0配置文件

    <?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-con ...