2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 微信抢红包软件-android

微信抢红包软件-android

时间:2021-03-26 09:14:02

相关推荐

微信抢红包软件-android

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

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

(1) /p/19ddd41aa349

(2) /zero_zero_zero_zero/article/details/5009

这个的源码和解释已经吃透了:

(3)/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;@Overridepublic 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();}}}/*** 服务连接*/@Overrideprotected void onServiceConnected() {Toast.makeText(this, "抢红包服务开启", Toast.LENGTH_SHORT).show();super.onServiceConnected();}/*** 必须重写的方法:系统要中断此service返回的响应时会调用。在整个生命周期会被调用多次。*/@Overridepublic void onInterrupt() {Toast.makeText(this, "我快被终结了啊-----", Toast.LENGTH_SHORT).show();}/*** 服务断开*/@Overridepublic 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);//后面的参数|表示同时传入两个值,最后的是调试用的TagwakeLock = 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;}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。