纯粹是兴趣,google提供了android操作系统的钩子AccessibilityService类,用于监听我们手机的焦点、窗口变化、按钮点击、通知栏变化等。微信红包自动抢通过AccessibilityService类,截取通知栏中有[微信红包]字样的通知,然后跳到微信红包界面领取红包。从网上的公开的代码调测了通过,但具体部署到手机上实操未进行,因此代码只做参考,留待后续需要时再深入研究AccessibilityService类。

1、eclipse+adt环境下新建android工程,命名为wxhb,AndroidManifest.xml配置如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.wxhb"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="17"android:targetSdkVersion="17" /><applicationandroid:allowBackup="true"android:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activity  android:name=".MainActivity"  android:label="@string/app_name" >  <intent-filter>  <action android:name="android.intent.action.MAIN" />  <category android:name="android.intent.category.LAUNCHER" />  </intent-filter>  </activity>  <service  android:enabled="true"  android:exported="true"  android:label="@string/app_name"  android:name=".EnvelopeService"  android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">  <intent-filter>  <action android:name="android.accessibilityservice.AccessibilityService"/>  </intent-filter>  <meta-data  android:name="android.accessibilityservice"  android:resource="@xml/envelope_service_config"/>  </service>  </application></manifest>

2、wxhb工程res目录下新建xml文件夹,并创建envelope_service_config.xml,代码如下:

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

3、wxhb工程res目录下layout的文件activity_main.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"  android:paddingRight="@dimen/activity_horizontal_margin"  android:paddingTop="@dimen/activity_vertical_margin"  tools:context=".MainActivity">  <Button  android:id="@+id/start"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:padding="10dp"  android:layout_centerInParent="true"  android:textSize="18sp"  android:text="打开辅助服务"/>  </RelativeLayout>

4、wxhb工程res目录下values的文件strings.xml代码如下:

<resources><string name="app_name">wxhb</string><string name="accessibility_description">wechatdesc</string></resources>

5、wxhb工程res目录下values的文件dimens.xml代码如下:

<?xml version="1.0" encoding="utf-8"?>
<resources><dimen name="activity_vertical_margin">10dp</dimen>          <dimen name="activity_horizontal_margin">10dp</dimen>
</resources>

6、wxhb工程src目录下新建包com.wxhb,主类MainActivity代码如下:

package com.wxhb;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;    public class MainActivity extends Activity {    private Button startBtn;    @Override    protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    startBtn = (Button) findViewById(R.id.start);    startBtn.setOnClickListener(new View.OnClickListener() {    @Override    public void onClick(View v) {    try {    //打开系统设置中辅助功能    Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);    startActivity(intent);    Toast.makeText(MainActivity.this, "找到抢红包,然后开启服务即可", Toast.LENGTH_LONG).show();    } catch (Exception e) {    e.printStackTrace();    }    }    });    }    /*@Override    public boolean onCreateOptionsMenu(Menu menu) {    // Inflate the menu; this adds items to the action bar if it is present.    getMenuInflater().inflate(R.menu.menu_main, menu);    return true;    }    @Override    public boolean onOptionsItemSelected(MenuItem item) {    // Handle action bar item clicks here. The action bar will    // automatically handle clicks on the Home/Up button, so long    // as you specify a parent activity in AndroidManifest.xml.    int id = item.getItemId();    //noinspection SimplifiableIfStatement    if (id == R.id.action_settings) {    return true;    }    return super.onOptionsItemSelected(item);    }   */
}  

7、wxhb工程src目录下新建包com.wxhb,集成AccessibilityService类的代码如下:

package com.wxhb;import android.accessibilityservice.AccessibilityService;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
import android.os.Build;
import android.os.Handler;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;  import java.util.List;  /** * <p>Created by Administrator</p> * <p/> * 抢红包外挂服务 */
public class EnvelopeService extends AccessibilityService {  static final String TAG = "Jason";  /** * 微信的包名 */  static final String WECHAT_PACKAGENAME = "com.tencent.mm";  /** * 红包消息的关键字 */  static final String ENVELOPE_TEXT_KEY = "[微信红包]";  Handler handler = new Handler();  @Override  public void onAccessibilityEvent(AccessibilityEvent event) {  final int eventType = event.getEventType();  Log.d(TAG, "事件---->" + event);  //通知栏事件  if (eventType == 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(ENVELOPE_TEXT_KEY)) {  openNotification(event);  break;  }  }  }  } else if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {  openEnvelope(event);  }  }  /*@Override protected boolean onKeyEvent(KeyEvent event) { //return super.onKeyEvent(event); return true; }*/  @Override  public void onInterrupt() {  Toast.makeText(this, "中断抢红包服务", Toast.LENGTH_SHORT).show();  }  @Override  protected void onServiceConnected() {  super.onServiceConnected();  Toast.makeText(this, "连接抢红包服务", Toast.LENGTH_SHORT).show();  }  private void sendNotificationEvent() {  AccessibilityManager manager = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE);  if (!manager.isEnabled()) {  return;  }  AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED);  event.setPackageName(WECHAT_PACKAGENAME);  event.setClassName(Notification.class.getName());  CharSequence tickerText = ENVELOPE_TEXT_KEY;  event.getText().add(tickerText);  manager.sendAccessibilityEvent(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.JELLY_BEAN)  private void openEnvelope(AccessibilityEvent event) {  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();  }  }  @TargetApi(Build.VERSION_CODES.JELLY_BEAN)  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(ENVELOPE_TEXT_KEY);  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);  break;  }  }  }  }
}

eclipse+adt下开发android微信红包自动抢(AccessibilityService类)相关推荐

  1. android 最新微信红包,分享Android微信红包插件

    本文实例为大家分享了Android微信红包插件,供大家参考,具体内容如下 效果图: 具体代码 @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private vo ...

  2. xposed开发11 - 微信红包

    xposed开发11 - 微信红包 private static Activity launcherUIActivity = null;// 微信红包 hookClass = "com.te ...

  3. 微信抢红包MATLAB,微信红包怎么抢才是运气王?有人做了实验,看结果!

    在抢微信红包的过程中,可能许多人有这样一种感觉,抢红包貌似后抢比先抢能拿到更多的钱?有人就做了一个实验-- 友情提示: 全文约6400字,阅读全文约10分钟.如果觉得时间紧张,可以跳过实验过程直接拉至 ...

  4. 微信公众 mysql回复图片_微信公众号开发之微信公共平台消息回复类实例

    本文实例讲述了微信公众号开发之微信公共平台消息回复类.分享给大家供大家参考.具体如下: 微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,这里就给各位 ...

  5. Android+eclipse+adt搭建开发环境

    一.下载相关软件 android开发环境 准备工作:下载Eclipse.JDK.Android SDK.ADT插件 下载地址:JDK:http://www.oracle.com/technetwork ...

  6. Android微信/QQ红包自动抢(AccessibilityService)

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

  7. Android入门教程三之使用Eclipse+ADT+SDK开发安卓APP

    前言: 1.这里我们有两条路可以选,直接使用封装好的用于开发Android的ADT Bundle,或者自己进行配置 因为谷歌已经放弃了ADT的更新,官网上也取消的下载链接,这里提供谷歌放弃更新前最新版 ...

  8. 微信小程序红包开发思路 微信红包小程序开发思路讲解

    之前公司开发小程序红包,将自己在开发的过程中遇到的一些坑分享到了博客里.不少人看了以后,还是不明白怎么开发.也加了我微信咨询.所以今天,我就特意再写一篇文章,这次就不谈我开发中遇到的坑了.就主要给大家 ...

  9. eclipse adt with the android sdk for windows,关于Windows:Eclipse:不允许我使用Android SDK,错误地声称我的ADT已过时...

    我正在使用Eclipse开发Android系统,直到昨天一切都运行良好. 我使用Ninite更新了我的所有内容,包括JRE和所有内容(提示:请勿这样做),它重新启动了计算机,而没有在编辑工作区的过程中 ...

最新文章

  1. 遍历百万级Redis的键值的大结局
  2. C#生成的图片无法在ps中打开
  3. 马云口中的“计划经济”其实是一种大数据和人工智能
  4. 1-jQuery - AJAX load() 方法【基础篇】
  5. 【控制】《最优控制理论与系统》-胡寿松老师-第2章-最优控制中的变分法
  6. 普通大学生的 Java 开发能力到什么水平才能进大厂?
  7. 次短路 Yen氏算法 凸包
  8. Python百度语音合成
  9. excel、doc等office文件转pdf方法总结
  10. CentOS7安装Pentaho Server 8.1 CE 社区版
  11. YOLOV5改进||YOLOV5+GSConv+Slim Neck
  12. Excel数组与数组公式
  13. 一个合格的项目经理都需要做哪些事情?
  14. redis mysql qps_测算Redis处理实际生产请求的QPS/TPS
  15. 西门子P L C 1200与smart的S 7通讯
  16. 启动hive的时候master:8020 failed on connection exception
  17. python识别电脑图像_计算机屏幕图像识别
  18. Python列表去重顺序不变
  19. 这个将996反对到极致的网站,在GitHub上的Star数已经狂飙到 10 万+了
  20. 通过百度坐标获取地址

热门文章

  1. c语言计算pi后1000位,计算圆周率 Pi (π)值, 精确到小数点后 10000 位
  2. apache服务器配置证书方法!
  3. luogu P2679——子串
  4. 一些好用的 资料网站
  5. mysql主从 1050错误
  6. 使用rqt_console和roslaunch---ROS学习第7篇
  7. 有助于项目管理(PM)指导思想
  8. MTK android flash配置
  9. Windows CE设备驱动开发之电源管理
  10. WINCE cvrtbin命令简介