iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android辅助功能AccessibilityService与抢红包辅助
  • 535
分享到

Android辅助功能AccessibilityService与抢红包辅助

抢红包Android 2022-06-06 09:06:37 535人浏览 独家记忆
摘要

推荐阅读:Android中微信抢红包插件原理解析及开发思路 抢红包的原理都差不多,一般是用Android的辅助功能(AccessibilityService类)先监听通知栏事件

推荐阅读:Android微信抢红包插件原理解析及开发思路

抢红包的原理都差不多,一般是用Android的辅助功能(AccessibilityService类)先监听通知栏事件或窗口变化事件来查找红包关键字然后去模拟点击或打开红包。

下面附上源码,程序已实现自动抢红包,屏黑屏状态自动解锁亮屏,Android4.X测试通过。函数具体功能请看详细注释。
注:在聊天界面收到红包不会自动打开,因为通知栏没有消息提示从而监听不了,此时只需手动点一下即可。其他未知情况请自行用LoGCat调试,源码已经有相关的调试信息。软件仅供学习娱乐。


<pre style="margin-top: 0px; margin-bottom: 0px;"><span style="font-family: Arial, Helvetica, sans-serif; color: rgb(192, 192, 192);"></span><pre style="margin-top: 0px; margin-bottom: 0px;">import java.util.Calendar; 
import java.util.List; 
import android.accessibilityservice.AccessibilityService; 
import android.annotation.SuppressLint; 
import android.app.KeyguardManager; 
import android.app.KeyguardManager.KeyguardLock; 
import android.app.Notification; 
import android.app.PendingIntent; 
import android.app.PendingIntent.CanceledException; 
import android.content.Context; 
import android.media.MediaPlayer; 
import android.os.PowerManager; 
import android.util.Log; 
import android.view.accessibility.AccessibilityEvent; 
import android.view.accessibility.AccessibilitynodeInfo; 
import android.widget.Toast; 
public class Demo extends AccessibilityService {
private boolean canGet = false;//能否点击红包
private boolean enableKeyguard = true;//默认有屏幕锁
//窗口状态
private static final int WINDOW_NONE = 0;
private static final int WINDOW_LUCKYMONEY_RECEIVEUI = 1;
private static final int WINDOW_LUCKYMONEY_DETaiL = 2;
private static final int WINDOW_LAUNCHER = 3;
private static final int WINDOW_OTHER = -1;
//当前窗口
private int mCurrentWindow = WINDOW_NONE;
//锁屏、解锁相关
private KeyguardManager km;
private KeyguardLock kl;
//唤醒屏幕相关
private PowerManager pm;
private PowerManager.WakeLock wl = null;
//播放提示声音
private MediaPlayer player;
public void playSound(Context context) {
Calendar cal = Calendar.getInstance();
int hour = cal.get(Calendar.HOUR_OF_DAY);
//夜间不播放提示音
if(hour > 7 && hour < 22) { 
player.start();
}
}
//唤醒屏幕和解锁
private void wakeAndUnlock(boolean unLock)
{
if(unLock)
{
//若为黑屏状态则唤醒屏幕
if(!pm.isScreenOn()) {
//获取电源管理器对象,ACQUIRE_CAUSES_WAKEUP这个参数能从黑屏唤醒屏幕
wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "bright");
//点亮屏幕
wl.acquire();
Log.i("demo", "亮屏");
}
//若在锁屏界面则解锁直接跳过锁屏
if(km.inKeyguardRestrictedInputMode()) {
//设置解锁标志,以判断抢完红包能否锁屏
enableKeyguard = false;
//解锁
kl.disableKeyguard();
Log.i("demo", "解锁");
}
}
else
{
//如果之前解过锁则加锁以恢复原样
if(!enableKeyguard) {
//锁屏
kl.reenableKeyguard();
Log.i("demo", "加锁");
}
//若之前唤醒过屏幕则释放之使屏幕不保持常亮
if(wl != null) {
wl.release();
wl = null;
Log.i("demo", "关灯");
}
}
}
//通过文本查找节点
public AccessibilityNodeInfo findNodeInfosByText(AccessibilityNodeInfo nodeInfo, String text) {
List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(text);
if(list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}
//模拟点击事件
public void perfORMClick(AccessibilityNodeInfo nodeInfo) {
if(nodeInfo == null) {
return;
}
if(nodeInfo.isClickable()) {
nodeInfo.perforMaction(AccessibilityNodeInfo.ACTION_CLICK);
} else {
performClick(nodeInfo.getParent());
}
}
//模拟返回事件
public void performBack(AccessibilityService service) {
if(service == null) {
return;
}
service.performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
}
//实现辅助功能
@Override 
public void onAccessibilityEvent(AccessibilityEvent event) { 
int eventType = event.getEventType();
Log.i("demo", Integer.toString(eventType));
switch (eventType) { 
//第一步:监听通知栏消息 
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: 
List<CharSequence> texts = event.getText(); 
if (!texts.isEmpty()) { 
for (CharSequence text : texts) { 
String content = text.toString(); 
Log.i("demo", "text:"+content);
//收到红包提醒
if (content.contains("[微信红包]")||content.contains("[QQ红包]")) { 
//模拟打开通知栏消息 
if (event.getParcelableData() != null && event.getParcelableData() instanceof Notification) {
//播放提示音
playSound(this);
//若是微信红包则解锁并自动打开,若是qq红包则只提示并跳转到有红包的聊天界面,暂未实现qq红包自动领取功能
if(content.contains("[微信红包]"))
wakeAndUnlock(true);
Log.i("demo", "canGet=true");
canGet = true;
try {
Notification notification = (Notification) event.getParcelableData(); 
PendingIntent pendingIntent = notification.contentIntent; 
pendingIntent.send();
} catch (CanceledException e) { 
e.printStackTrace(); 
}
}
break;
} 
} 
} 
break;
//第二步:监听是否进入微信红包消息界面 
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
String className = event.getClassName().toString();
if (className.equals("com.tencent.mm.ui.LauncherUI")) { 
mCurrentWindow = WINDOW_LAUNCHER;
//开始抢红包 
Log.i("demo", "准备抢红包...");
getPacket();
} else if (className.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI")) {
mCurrentWindow = WINDOW_LUCKYMONEY_RECEIVEUI;
//开始打开红包
Log.i("demo", "打开红包");
openPacket();
wakeAndUnlock(false);
} else if(className.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI")) {
mCurrentWindow = WINDOW_LUCKYMONEY_DETAIL;
//返回以方便下次收红包
Log.i("demo", "返回");
performBack(this);
} else {
mCurrentWindow = WINDOW_OTHER;
}
break;
case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
if(mCurrentWindow != WINDOW_LAUNCHER) { //不在聊天界面或聊天列表,不处理
return;
}
if(canGet) {
getPacket();
}
break;
}
}
//找到红包并点击
@SuppressLint("Newapi") 
private void getPacket() { 
AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); 
if (nodeInfo == null) { 
return; 
}
// 找到领取红包的点击事件 
List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText("领取红包");
if(list != null ) {
if(list.isEmpty()) {
Log.i("demp", "领取列表为空");
// 从消息列表查找红包
AccessibilityNodeInfo node = findNodeInfosByText(nodeInfo, "[微信红包]");
if(node != null) {
canGet = true;
performClick(node);
}
}
else {
if(canGet) {
//最新的红包领起
AccessibilityNodeInfo node = list.get(list.size() - 1);
performClick(node);
Log.i("demo", "canGet=false");
canGet = false;
}
}
}
}
//打开红包
@SuppressLint("NewApi") 
private void openPacket() { 
AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
if(nodeInfo == null) {
return;
}
Log.i("demo", "查找打开按钮...");
AccessibilityNodeInfo targetNode = null;
//如果红包已经被抢完则直接返回
targetNode = findNodeInfosByText(nodeInfo, "看看大家的手气");
if(targetNode != null) {
performBack(this);
return;
}
//通过组件名查找开红包按钮,还可通过组件id直接查找但需要知道id且id容易随版本更新而变化,旧版微信还可直接搜“開”字找到按钮
if(targetNode == null) { 
Log.i("demo", "打开按钮中...");
for (int i = 0; i < nodeInfo.getChildCount(); i++) {
AccessibilityNodeInfo node = nodeInfo.getChild(i);
if("android.widget.Button".equals(node.getClassName())) {
targetNode = node;
break;
}
}
}
//若查找到打开按钮则模拟点击
if(targetNode != null) {
final AccessibilityNodeInfo n = targetNode;
performClick(n);
} 
} 
@Override
public void onInterrupt() {
Toast.makeText(this, "抢红包服务被中断啦~", Toast.LENGTH_LONG).show();
}
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Log.i("demo", "开启");
//获取电源管理器对象
pm=(PowerManager)getSystemService(Context.POWER_SERVICE);
//得到键盘锁管理器对象
km= (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
//初始化一个键盘锁管理器对象
kl = km.newKeyguardLock("unLock");
//初始化音频
player = MediaPlayer.create(this, R.raw.songtip_m);
Toast.makeText(this, "_已开启抢红包服务_", Toast.LENGTH_LONG).show();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("demo", "关闭");
wakeAndUnlock(false);
Toast.makeText(this, "_已关闭抢红包服务_", Toast.LENGTH_LONG).show();
}
}

AndroidManifest.xml中声明相关服务和权限


<uses-permission android:name="android.permission.WAKE_LOCK" /> 
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> 
<application 
android:allowBackup="true" 
android:icon="@drawable/ic_launcher" 
android:label="@string/app_name" 
android:theme="@style/AppTheme" > 
<pre name="code" class="html"><service 
android:name="com.example.test.Demo" android:enabled="true" android:exported="true" android:label="@string/app_name" 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="@layout/accessibility_config"/></service></application>

accessibility_config.xml服务配置内容如下


<accessibility-service xmlns:android="Http://schemas.android.com/apk/res/android" 
android:accessibilityEventTypes="typeNotificationStateChanged|typewindowstateChanged|typeWindowContentChanged" 
android:accessibilityFeedbackType="feedbackGeneric" 
android:accessibilityFlags="flagDefault" 
android:canRetrieveWindowContent="true" 
android:description="@string/desc" 
android:notificationTimeout="100" 
android:packageNames= "com.tencent.mm,com.tencent.mobileqq" /> 

其中description为辅助功能的描述内容,packageNames为监听的程序包名,此处只监听微信和QQ的accessibilityEventTypes

以上所述是针对Android辅助功能AccessibilityService与抢红包辅助的相关知识,希望对大家有所帮助。

您可能感兴趣的文章:Android AccessibilityService实现微信抢红包插件AccessibilityService实现微信发红包功能


--结束END--

本文标题: Android辅助功能AccessibilityService与抢红包辅助

本文链接: https://www.lsjlt.com/news/25704.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android辅助功如何实现自动抢红包
    这篇文章主要介绍Android辅助功如何实现自动抢红包,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、描述最近看到同事有用抢红包的软件,就想看看抢红包的具体实现是如何的,所以了解了一下,有用辅助功能实现的,所以在下...
    99+
    2023-05-30
    android
  • android辅助功能怎么实现
    Android系统提供了一些辅助功能的API,可以帮助开发者实现辅助功能的功能。 使用辅助功能服务:开发者可以创建一个辅助功能服...
    99+
    2023-10-23
    android
  • Android 应用自动开启辅助(无障碍)功能并使用辅助(无障碍)功能
    目录 一.背景 二.前提条件 三.将普通应用转换成系统应用 1.在AndroidManifest文件中添加来源地址:https://blog.csdn.net/gongjdde/article/details/131431675...
    99+
    2023-09-10
    pycharm ide python
  • 如何添加Vue的辅助功能
    随着前端框架的不断发展,Vue作为其中之一的代表,在前端开发中扮演着重要的角色。Vue具有简单易学、灵活性强、性能高等优点。但是Vue的基本功能是有限的,如果想要实现更复杂的功能,需要添加一些辅助功能。本文将介绍如何添加Vue的辅助功能,以...
    99+
    2023-05-14
  • Android布局ConstraintLayout代码修改约束及辅助功能
    目录实践过程代码修改约束辅助功能GuidelineBarrierFlowPlaceholderGroup和Layer实践过程 代码修改约束 <xml version="1.0"...
    99+
    2024-04-02
  • Xamarin.Forms XAML的辅助功能Code Snippet有什么用
    这篇文章将为大家详细讲解有关Xamarin.Forms XAML的辅助功能Code Snippet有什么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Xamarin.Forms XAML的辅助功能Cod...
    99+
    2023-06-04
  • 如何在Android应用中实现一个图库辅助器功能
    如何在Android应用中实现一个图库辅助器功能?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。实现步骤第一步,创建辅助类,使用弱引用持有Activity,防止内存溢出。 ...
    99+
    2023-05-31
    android roi
  • HTML框架集标签:辅助功能和可访问性
    HTML框架集标签在网页设计中已被弃用,它对辅助功能和可访问性造成了重大影响。了解其缺陷并采用替代方案对于创建包容性和无障碍的网站至关重要。 框架集的缺陷 框架集标签将浏览器窗口划分为多个框架,每个框架都可以独立加载内容。然而,这种方法...
    99+
    2024-03-05
    HTML框架集 标签 辅助功能 可访问性 无障碍
  • 酒吧行业开发小程序实用功能辅助是什么
    小编给大家分享一下酒吧行业开发小程序实用功能辅助是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一键预订包厢服务提升转化客户需要预订酒吧包厢以及KTV包厢时,不在需要下载app或者打电话向工作人员来进行预订服务,直接进...
    99+
    2023-06-27
  • 二维码如何辅助 ASP 网页实现 load 重定向的功能?
    随着互联网技术的不断发展,越来越多的网站采用ASP.NET技术来开发网页。但是,ASP.NET网页的load重定向功能并不像其他网页那样简单。在这种情况下,二维码就成为了一个非常有用的工具,可以帮助ASP.NET网页实现load重定向功能。...
    99+
    2023-07-03
    二维码 load 重定向
  • HTML 有序列表的辅助功能:为所有人创建无障碍的网站
    HTML 有序列表不仅是组织和显示内容的便捷方式,还对无障碍网站设计至关重要。有序列表通过提供结构和语义信息,帮助屏幕阅读器用户轻松浏览和理解您的网站。 有序列表是如何工作的 有序列表使用 <ol> 标签创建,其中包含 &l...
    99+
    2024-03-06
    HTML、有序列表、无障碍、辅助功能、屏幕阅读器
  • HTML 有序列表的辅助功能:确保列表对所有用户都具有可访问性
    有序列表用于表示具有特定顺序的项目列表。为了确保有序列表对所有用户均可访问,包括残障人士,必须考虑它们的辅助功能。本文探讨了创建具有辅助功能的 HTML 有序列表的最佳实践。 ARIA 角色和标签 有序列表应该使用 ARIA(无障碍互联网...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作