关于抢红包的文章已经很多了,我再来总结下,QQ的顺便也实现下,原理很简单,搜索屏幕中的文字,搜索到了就点击,QQ相对来说要简单一些

关键代码:

AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
nodeInfo.findAccessibilityNodeInfosByText("恭喜");

首先,在辅助功能里面开启服务后,onAccessibilityEvent方法会接受到一些事件,我们来看看常用的一些事件

public class Types{final class types {//所有事件public static final int types_all_mask = -1;//通知栏public static final int type_notification_state_changed = 64;//点击事件public static final int type_view_clicked = 1;//控件获取焦点public static final int type_view_focused = 8;//长按事件public static final int type_view_long_clicked = 2;//页面变动public static final int type_view_scrolled = 4096;//控件选中public static final int type_view_selected = 4;//输入框文本改变public static final int type_view_text_changed = 16;//输入框文本selection改变public static final int type_view_text_selection_changed = 8192;//窗口内容改变public static final int type_window_content_changed = 2048;//窗口状态改变public static final int type_window_state_changed = 32;}
}
typeAllMask代表可以监听到所有的事件,我们这次只用到typeNotificationStateChanged和typeWindowStateChanged,还有typeWindowContentChanged

下面开始具体代码

1、创建Service

WXEnvelopeService.java

package com.zx.redenvelopes;import android.accessibilityservice.AccessibilityService;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Instrumentation;
import android.app.KeyguardManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Handler;
import android.os.PowerManager;
import android.support.annotation.RequiresApi;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;import static android.content.ContentValues.TAG;//文本类型:
// 微信text==童鞋: 恭喜发财//红包类型:
// 微信text==童鞋: [微信红包]恭喜发财,大吉大利public class WXEnvelopeService extends AccessibilityService {static final String ENVELOPE_TEXT_KEY = "[微信红包]";@SuppressLint("NewApi")@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {final int eventType = event.getEventType();//Log.d(TAG, "微信事件--------------------------" + event.getEventType());//通知栏事件if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {List<CharSequence> texts = event.getText();if (!texts.isEmpty()) {for (CharSequence t : texts) {String text = String.valueOf(t);Log.v("tag", "监控微信消息==" + text);if (text.contains(ENVELOPE_TEXT_KEY)) {openNotification(event);break;}}}} else if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {openEnvelope(event);} else if (eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {openEnvelopeContent(event);}}/*** 打开通知栏消息并跳转到红包页面*/@TargetApi(Build.VERSION_CODES.JELLY_BEAN)private void openNotification(AccessibilityEvent event) {if (event.getParcelableData() == null || !(event.getParcelableData() instanceof Notification)) {return;}//以下是精华,将微信的通知栏消息打开Notification notification = (Notification) event.getParcelableData();PendingIntent pendingIntent = notification.contentIntent;try {pendingIntent.send();} catch (PendingIntent.CanceledException e) {e.printStackTrace();}}@TargetApi(Build.VERSION_CODES.KITKAT)@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)private void openEnvelope(AccessibilityEvent event) {if ("com.tencent.mm.ui.LauncherUI".equals(event.getClassName())) {checkKeyFirst();} else if ("com.tencent.mm.plugin.luckymoney.ui.En_fba4b94f".equals(event.getClassName())) {checkOpen();} else if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI".equals(event.getClassName())) {//Toast.makeText(this, "红包已经抢完--------", Toast.LENGTH_SHORT).show();}}@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)private void openEnvelopeContent(AccessibilityEvent event) {if ("android.widget.TextView".equals(event.getClassName())) {checkKeyFirst();} else if ("com.tencent.mm.plugin.luckymoney.ui.En_fba4b94f".equals(event.getClassName())) {checkOpen();} else if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI".equals(event.getClassName())) {// Toast.makeText(this, "红包已经抢完--------", Toast.LENGTH_SHORT).show();}}@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)private void checkOpen() {AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();if (nodeInfo == null) {return;}List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("恭喜");for (int i = list.size() - 1; i >= 0; i--) {AccessibilityNodeInfo parent = list.get(i).getParent();for (int j = 0; j < parent.getChildCount(); j++) {AccessibilityNodeInfo child = parent.getChild(j);if (child != null && child.isClickable()) {child.performAction(AccessibilityNodeInfo.ACTION_CLICK);break;}}}}private void checkKeyFirst() {AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();if (nodeInfo == null) {return;}List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("领取红包");if (list.isEmpty()) {return;}for (int i = list.size() - 1; i >= 0; i--) {AccessibilityNodeInfo parent = list.get(i).getParent();if (parent != null) {parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);break;}}}@Overridepublic void onInterrupt() {Toast.makeText(this, "微信抢红包服务已关闭", Toast.LENGTH_SHORT).show();}@Overrideprotected void onServiceConnected() {super.onServiceConnected();Toast.makeText(this, "微信抢红包服务已开启", Toast.LENGTH_SHORT).show();}}

QQEnvelopeService.java

package com.zx.redenvelopes;import android.accessibilityservice.AccessibilityService;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;import java.util.List;import static android.content.ContentValues.TAG;//文本类型:
// 监控QQ消息==童鞋: 恭喜发财//红包类型:
// 监控QQ消息==童鞋: [QQ红包]恭喜发财public class QQEnvelopeService extends AccessibilityService {static final String ENVELOPE_TEXT_KEY = "[QQ红包]";@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)@Overridepublic void onAccessibilityEvent(AccessibilityEvent event) {Log.d(TAG, "QQ事件--------------------------" + event.getEventType());final int eventType = event.getEventType();if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {List<CharSequence> texts = event.getText();if (!texts.isEmpty()) {for (CharSequence t : texts) {String text = String.valueOf(t);Log.v("tag", "监控QQ消息==" + text);if (text.contains(ENVELOPE_TEXT_KEY)) {openNotification(event);break;}}}} else if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {openEnvelope(event);} else if(eventType == AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED) {openEnvelopeContent(event);}}/*** 打开通知栏消息并跳转到红包页面*/@TargetApi(Build.VERSION_CODES.JELLY_BEAN)private void openNotification(AccessibilityEvent event) {if (event.getParcelableData() == null || !(event.getParcelableData() instanceof Notification)) {return;}//以下是精华,将微信的通知栏消息打开Notification notification = (Notification) event.getParcelableData();PendingIntent pendingIntent = notification.contentIntent;try {pendingIntent.send();} catch (PendingIntent.CanceledException e) {e.printStackTrace();}}@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)private void openEnvelope(AccessibilityEvent event) {if ("com.tencent.mobileqq.activity.SplashActivity".equals(event.getClassName())) {checkKey();}}@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)private void openEnvelopeContent(AccessibilityEvent event) {/*if ("android.widget.RelativeLayout".equals(event.getClassName())) {checkKey();} else if("android.widget.TextView".equals(event.getClassName())) {checkKey();}*/checkKey();}@TargetApi(Build.VERSION_CODES.JELLY_BEAN)private void checkKey() {AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();if (nodeInfo == null) {return;}List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("点击拆开");if (list.isEmpty()) {return;}for (AccessibilityNodeInfo info : list) {AccessibilityNodeInfo parent = info.getParent();if (parent != null) {parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);break;}}}@Overridepublic void onInterrupt() {Toast.makeText(this, "QQ抢红包服务已关闭", Toast.LENGTH_SHORT).show();}@Overrideprotected void onServiceConnected() {super.onServiceConnected();Toast.makeText(this, "QQ抢红包服务已开启", Toast.LENGTH_SHORT).show();}}

2、创建对应的xml

res/xml/envelope_service_config_qq.xml

<?xml version="1.0" encoding="utf-8"?>
<!-- 关键是android:accessibilityEventTypes="typeAllMask", typeAllMask代表监听所有的事件,这边不写的话,AccessibilityService就接收不到 -->
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeAllMask"android:accessibilityFeedbackType="feedbackGeneric"android:accessibilityFlags="flagRequestFilterKeyEvents"android:canRetrieveWindowContent="true"android:canRequestFilterKeyEvents="true"android:description="@string/accessibility_description"android:notificationTimeout="100"android:packageNames="com.tencent.mobileqq" />

res/xml/envelope_service_config_wx.xml

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"android:accessibilityEventTypes="typeWindowContentChanged|typeNotificationStateChanged|typeWindowStateChanged"android:accessibilityFeedbackType="feedbackGeneric"android:accessibilityFlags="flagRequestFilterKeyEvents"android:canRetrieveWindowContent="true"android:canRequestFilterKeyEvents="true"android:description="@string/accessibility_description"android:notificationTimeout="100"android:packageNames="com.tencent.mm" />

3、AndroidManifest.xml中注册

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.zx.redenvelopes"><uses-permission android:name="android.permission.DISABLE_KEYGUARD" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_app"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><serviceandroid:enabled="true"android:exported="true"android:label="QQ自动抢红包服务"android:name=".QQEnvelopeService"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService"/></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/envelope_service_config_qq"/></service><serviceandroid:enabled="true"android:exported="true"android:label="微信自动抢红包服务"android:name=".WXEnvelopeService"android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"><intent-filter><action android:name="android.accessibilityservice.AccessibilityService"/></intent-filter><meta-dataandroid:name="android.accessibilityservice"android:resource="@xml/envelope_service_config_wx"/></service></application></manifest>

最后开启服务的代码如下:

//打开系统设置中辅助功能
Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);startActivity(intent);Toast.makeText(MainActivity.this, "找到微信/QQ自动抢红包服务,开启即可", Toast.LENGTH_LONG).show();

http://blog.csdn.net/jiangwei0910410003/article/details/48895153
http://blog.csdn.net/qq_30379689/article/details/53242953

源码下载:
http://download.csdn.net/download/zx_android/10213833

Android微信/QQ红包自动抢(AccessibilityService)相关推荐

  1. eclipse+adt下开发android微信红包自动抢(AccessibilityService类)

    纯粹是兴趣,google提供了android操作系统的钩子AccessibilityService类,用于监听我们手机的焦点.窗口变化.按钮点击.通知栏变化等.微信红包自动抢通过Accessibili ...

  2. 最新版本微信和QQ红包自动领取安装包

    最新版本微信和QQ红包自动领取安装包下载地址: http://www.ppsbbs.tech/?thread-27.htm

  3. 微信抢红包神器自动抢软件

    微信抢红包神器自动抢软件,支持企业红包,微信红包,还有各种红包雨,让你轻松秒变抢红包达人,微信抢红包神器自动抢最佳软件里面包括了各种形式,不需要root就能够轻松使用,轻轻松松获得红包,喜欢的玩家来试 ...

  4. android hide qq红包,伪装QQ红包绕过URL检测

    伪装QQ红包&绕过URL检测 2015-09-24 10:23:49 阅读:0次 一.绕过PC端恶意URL提示 (其实可以手机QQ是无法正常识别出这个url的,所以希望能够改进一下手机客户端的 ...

  5. android实现自动抢红包,Android手机辅助功能实现自动抢微信红包功能

    这个东西就算是纯粹的Android开发者也很少用,功能就相当于Xposed,但它是Android自带的服务,目的在于帮助那些具有视觉.身体或年龄相关限制的用户更轻松的使用Android设备和应用,它一 ...

  6. android微信qq提醒功能,Android用Window实现类似微信、QQ来消息的时候的通知提示

    先上效果图 本例结合Window和动画来实现类似于微信.QQ来消息的时候的弹框提示 平时玩微信会发现,即使App在后台,但是来消息的时候仍然会弹框提示,这就肯定得用Window实现了 Window表示 ...

  7. android微信小程序自动填表_微信小程序自动化,记录趟过的坑!

    项目思想:关键字+数据驱动混合测试 基于Android-微信小程序自动化的关键是:webview的切换 对于微信App来说如何从NATIVE切换到webview的过程 测试版本信息 1.微信版本:7. ...

  8. android微信小程序自动填表_微信小程序自动回复用户消息

    最近用java做了一个实现在微信小程序内根据用户发送的消息内容回复用不通的消息功能,相当于一个自动回复的客服消息,效果图如下: ​​ ​ 当用户在小程序输入框中输入内容或其他操作时,后台根据用户输入的 ...

  9. android微信qq分享,android 一键分享 QQ 微信

    网上有很多介绍说有第三方集成工具,如sharesdk,这个操作太麻烦了. 如下介绍的是调用系统自带的,我这里是XML文件,对应的文件类型参见:// http://blog.csdn.net/wangy ...

最新文章

  1. 解题报告(十五)莫比乌斯反演与积性函数(ACM / OI)
  2. 程序员面试金典 - 面试题 16.21. 交换和(哈希set)
  3. TensorFlow基本原理,入门教程网址
  4. Layui导航、面包屑
  5. java界面混乱_JAVA界面不稳定
  6. PD连接远程mysql_PowerDesigner连接远程Oracle数据库 | 学步园
  7. [Ubuntu] apache .htaccess根据访问的域名指向不同的目录
  8. mysql------变量
  9. Linux下安装ActiveMQ(CentOS7)
  10. poj 2329 Nearest number - 2 这道题广搜为什么就是wa啊!!求解
  11. CSS权威指南(1)
  12. sqlserver 数据库文件损坏、数据库可疑修复处理
  13. 微信小程序 人脸识别功能 代码 wx.faceDetect
  14. ObjectiveC基础教程(第2版)
  15. 安卓 xdroid framework
  16. Oracle中rank函数详解
  17. C解析8583报文55域
  18. メンアットワーク!3 men at work3 猎人们的青春攻略
  19. C++ 不知算法系列之聊聊希尔、归并排序算法中的分治哲学
  20. Android代号、版本、API版本号

热门文章

  1. routeros 3322电信联通脚本
  2. 一项“和灾难赛跑的教育”工程 ——马小平编著《人文素养读本》序
  3. 简单魔兽改键的基本原理及基于MFC实现
  4. 【多媒体封装格式详解】---ASF(WMV/WMA)【2】完
  5. java super父类方法_java super关键字,super调用父类构造方法详解
  6. Firefox火狐浏览器打开页面链接的方式的设置
  7. 算法学习笔记五:最短路径
  8. unity 等待...动画_介绍Unity 2019.1的动画索具预览包
  9. 【SpringBoot内容协商】
  10. SpaceX“超级高铁”设计原型曝光,时速可高达每小时760英里