Android微信抢红包功能的实现原理浅析

作者:一杯清泉 时间:2023-11-20 19:14:40 

快到过农历年了,微信红包也越来越多了,出现了好多红包 * 程序,就很好奇如何实现的,于是自己研究了一番,亲自写了个微信抢红包的APP。现在就一步一步来实现它。

实现思路

微信抢红包程序开启时候,他就可以随时识别、捕获红包,服务可以实现正在功能,当我们开启服务的时候,服务就不停的在后台运行,不停地轮询着微信里面的消息,当发现红包时候就立即打开微信红包所在的界面。但是他怎识别红包呢?需要找到微信抢红包里面节点的view,当找到对应的view,在获取view的关键字或者id,根据关键字或者id,自动的模拟点击,拆开红包。这里有一个AccessibilityService的服务,他是一个辅助类,可以实现这些功能。

AccessibilityService辅助类

AccessibilityService是一个辅助类,可以监听我们手机的焦点,窗口变化,按钮点击,声音提示等等,但是必须手动开启,不能通过代码开启,存在于设置里面的辅助功能,开启他我们可以增强互动性。现在来来使用他实现抢红包功能:

1、新建一个类QiangHongBaoService继承自AccessibilityService


@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
 //获取事件类型
 int type = event.getEventType();
 //在这里进行事件过滤

}

2、注册清单文件


<service
 android:name=".QiangHongBaoService"
 android:label="@string/app_name"
 android:enabled="true"
 android:exported="true"
 android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
 <intent-filter android:priority="1000">
   <action android:name="android.accessibilityservice.AccessibilityService"/>
 </intent-filter>
 <meta-data
   android:name="android.accessibilityservice"
   android:resource="@xml/envelope_service_config"/>
</service>

新建一个xml文件夹,创建envelope_service_config文件


<?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="flagDefault"
           android:canRetrieveWindowContent="true"
           android:description="@string/accessibility_description"            android:notificationTimeout="100"           android:packageNames="com.tencent.mm" />
记得加上网络权限:<uses-permission Android:name="android.permission.VIBRATE" />

抢红包业务逻辑处理

在微信抢红包界面上只关心两个事件类型:

1、AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED//监听通知栏消息

在监听通知栏消息界面主要是监听每次微信发过来的消息显示在通知栏时,获取消息,当发现获取的消息含有“微信红包”时就会立即打开 红包所显示的界面。


/**
* 从知消息栏打开微信聊天界面
* @param event
*/
private void openNotification(AccessibilityEvent event) {
 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();
   }
 }
}

2、AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED//当前窗口变化,是否进入微信聊天界面

在这里需要根据包名判断是否是聊天界面,如果是则点中红包,如果不是判断是否是拆红包界面,如果是则拆开,执行拆红包动作。

聊天界面的包名:com.tencent.mm.ui.LauncherUI

拆红包界面的包名:com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI


/**
* 点中红包
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
private void clickHongBao() {
 AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
 if (nodeInfo == null) {
   return;
 }
 List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(ENVLOP_OPEN_KEY);
 if (list.isEmpty()) {
   list = nodeInfo.findAccessibilityNodeInfosByText(ENVELOPE_TEXT_KEY);
   for (AccessibilityNodeInfo n : list) {
     n.performAction(AccessibilityNodeInfo.ACTION_CLICK);
     break;
   }
 } else {
   //最新的红包领起
   for (int i = list.size() - 1; i >= 0; i--) {
     AccessibilityNodeInfo parent = list.get(i).getParent();
     if (parent != null) {
       parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);
       break;
     }
   }
 }
}

/**
*拆红包
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
private void openHongBao() {
 AccessibilityNodeInfo rootInActiveWindow = getRootInActiveWindow();
 if (rootInActiveWindow == null) {
   return;
 }
 List<AccessibilityNodeInfo> nodeInfos = rootInActiveWindow.findAccessibilityNodeInfosByViewId(ENVLOP_CHECKED_KEY);
 for (AccessibilityNodeInfo nodeInfo : nodeInfos) {
   nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK);
 }
}

上例中的拆红包是依据控件的id拆开的,也可以按照关键字“拆红包”执行。但是效率略低于根据id拆红包,这样很可能影响抢红包的效率,需要注意的是拆红包的id在微信不同版本中是不一样的,所以需要经常改变,比较麻烦。此外当AccessibilityService服务被关闭时会回调onInterrupt方法,当连接上时会回调onServiceConnected方法,在这里可以做一些提示性的工作。

抢红包功能的开启

微信抢红包功能是通过手动开启的,直接在设置里面找到辅助功能,点击开启,为了方便,给activity设置一个按钮,采用隐式意图的方式,直接跳转至服务功能。


//打开系统设置中辅助功能
Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);
startActivity(intent);

到了这里微信抢红包的而核心功能介绍完了,抢红包的效率还受网络,手机内存大小,系统流畅度的影响,以及服务优先级等等因素的影响。这里只是学习一下,千万别用来经常 * 来抢红包,小心被封号哦!!!
源码已经上传至github,需要的点击打开链接

https://github.com/yoonerloop/WebEnvelope

以上所述是小编给大家介绍的Android微信抢红包功能的实现原理浅析网站的支持!

来源:http://blog.csdn.net/yoonerloop/article/details/54288209

标签:android,微信抢红包实现
0
投稿

猜你喜欢

  • Swagger2配置方式(解决404报错)

    2022-08-30 17:21:13
  • IDEA2020.1常用配置说明

    2023-01-09 02:11:50
  • C#通过委托调用Button单击事件的方法

    2022-11-29 22:09:15
  • java 二叉查找树实例代码

    2022-07-23 22:54:28
  • java、android可用的rtp封包解包h264案例

    2021-11-27 01:53:18
  • SpringBoot使用ApplicationEvent&Listener完成业务解耦

    2021-10-19 06:36:41
  • Java的StringBuilder在高性能场景下的正确用法

    2021-11-23 17:57:01
  • Unity实现粒子光效导出成png序列帧

    2023-08-30 21:22:52
  • 源码解析JDK 1.8 中的 Map.merge()

    2023-11-16 23:49:25
  • Mac中配置gradle环境及使用android studio打包jar包与arr包的方法

    2022-12-08 00:07:18
  • idea mybatis配置log4j打印sql语句的示例

    2023-11-25 10:32:39
  • Java基础之详解HashSet的使用方法

    2023-08-04 20:18:59
  • Java如何读取jar包中的resource资源文件

    2022-10-12 22:51:43
  • Java使用JDBC连接postgresql数据库示例

    2022-11-06 22:49:02
  • 深入c# GDI+简单绘图的具体操作步骤(三)

    2021-11-27 13:19:55
  • Mybatis-Plus实现SQL拦截器的示例

    2022-05-14 13:55:14
  • MyBatis的 config.xml标签

    2021-07-18 02:01:34
  • 字符串替换Replace仅替换第一个字符串匹配项

    2021-10-02 17:36:56
  • 利用 filter 机制给静态资源 url 加上时间戳,来防止js和css文件的缓存问题

    2022-03-16 07:51:24
  • java 生成xml并转为字符串的方法

    2023-01-07 08:27:30
  • asp之家 软件编程 m.aspxhome.com