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


猜你喜欢
- 今天在QQ空间看到一篇关于C#语言验证18位身份证号码的验证方法和实例代码,抽了些时间学习了一下,个人觉得还不错,所以把它记了下来,方便以后
- 场景:NFC是目前Android手机一个主流的配置硬件项,本文主要讲解一下Android开发中,NFC刷卡的两种实现方式以及相关方法源码解析
- Knn算法的核心思想是如果一个样本在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性
- 很多学习Android程序设计的人都会发现每个人对代码的写法都有不同的偏好,比较明显的就是对控件响应事件的写法的不同。因此本文就把这些写法总
- Hadoop是什么?Hadoop是一个开发和运行处理大规模数据的软件平台,是Appach的一个用java语言实现开源软件框架,实现在大量计算
- 有的人的电脑在使用 IntelliJ IDEA 的svn 时候,无法保存密码,输入密码时,勾选保存密码还是无效。每次都的输入密码,一次浪费2
- Maven热部署,顾名思义就是可以不影响项目在服务器中的运行情况,可以实现项目代码的更新,减少启动,编译时间,达到快速开发的目的,也不需要手
- 在POI的使用过程中,对大多数API User来说经常面临两个问题,这也是GridExcel致力解决的问题。问题1. 仅使用简单的导入导出功
- 本文实例讲述了Android基于OpenGL在GLSurfaceView上绘制三角形及使用投影和相机视图方法。分享给大家供大家参考,具体如下
- 注意事项阿里云的dataworks提供了OpenApi, 需要是企业版或旗舰版才能够调用,也就是付费项目。这里测试主要是调用拉取datawo
- 1.创建线程 在Java中创建线程有两种方法:使用Thread类和使用Runnable接口。在使用Runnable接口时需要建立
- 1.Java连接redisredis支持哪些语言可以操作 (去redis官网查询)1.1 使用Jedis (1)添加jedis依赖
- 进程之间的通信是为了解决不同进程之间的数据传输问题,这样可以让不同程序交互数据。实现进程通信的方式:1、剪切板;2、COM;3、内存映射文件
- 最近工作遇到一个需求,需要下载excel模板,编辑后上传解析存储到数据库。因此为了更好的理解公司框架,我就自己先用spring mvc实现了
- 基本介绍数据回显:模型数据导向视图(模型数据 ---> Controller ---> 视图)说明:SpringMVC在调用方法
- 问题注意:本人使用的Spring Boot 2.0.2, 对1.5.x系列未必有用。官方文档在这里直接解决办法0, 移除spring-boo
- 一.什么是SemaphoreSemaphore,俗称信号量,它是操作系统中PV操作的原语在java的实现,它也是基于AbstractQueu
- java 中Spark中将对象序列化存储到hdfs摘要: Spark应用中经常会遇到这样一个需求: 需要将JAVA对象序列化并存储到HDFS
- 1.项目介绍这是一款基于 Java 开发的移动端安卓小游戏——大家来拼图2.项目原理把选定的一张图片
- 工欲善其事,必先利其器很多程序员可能都忘了记录应用程序的行为是一件多么重要的事,当遇到多线程环境下高压力导致的并发bug时,你就能体会到记录