AccessibilityService实现微信发红包功能

作者:dzy_mails 时间:2023-06-23 03:51:53 

在AccessibilityService中我们可以做模拟操作,下面记述下通过AccessibilityService实现微信发红包的功能

1.配置AccessibilityService,需要通过集成AccessibilityService来执行操作。


public class TestAccessibilityService extends AccessibilityService {
 @Override
 public void onAccessibilityEvent(AccessibilityEvent event) {
   ...
 }

@Override
 public void onInterrupt() {
   VirtualControlManager.getInstance().onCancel();
 }
}

使用时,需要在AndroidManifest.xml进行配置


<service android:name=".TestAccessibilityService"
  android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
  android:label="@string/accessibility_service_label">
 <intent-filter>
     <action android:name="android.accessibilityservice.AccessibilityService" />
 </intent-filter>

<meta-data
     android:name="android.accessibilityservice"
     android:resource="@xml/accessibility_service_config" />

</service>

在res文件夹下创建xml文件夹,存放accessibility_service_config.xml


<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:accessibilityEventTypes="typeAllMask"
 android:accessibilityFeedbackType="feedbackGeneric"
 android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"
 android:canRetrieveWindowContent="true"
 android:description="@string/accessibility_service_description"
 android:notificationTimeout="100"/>
 <!--accessibilityEventTypes:表示该服务对界面中的哪些变化感兴趣,即哪些事件通知,比如窗口打开,滑动,
 焦点变化,长按等.具体的值可以在AccessibilityEvent类中查到,如typeAllMask表示接受所有的事件通知.-->
 <!--accessibilityFeedbackType:表示反馈方式,比如是语音播放,还是震动-->
 <!--canRetrieveWindowContent:表示该服务能否访问活动窗口中的内容.也就是如果你希望在服务中获取窗体内容的化,则需要设置其值为true.-->
 <!--notificationTimeout:接受事件的时间间隔,通常将其设置为100即可.-->
 <!--packageNames:表示对该服务是用来监听哪个包的产生的事件-->

这句话非常重要,后面会用到,切记


android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"

2.启动微信


Intent intent = new Intent(Intent.ACTION_MAIN);
//  intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent
//  .FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);

//加这个flag为了让微信能够进入的时候在会话列表
       intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

intent.addCategory(Intent.CATEGORY_LAUNCHER);
       ComponentName cn = new ComponentName(“com.tencent.mm”, “com.tencent.mm.ui.LauncherUI”);
       intent.setComponent(cn);
       context.startActivity(intent);

网上很多启动微信的代码在setFlags中的参数都是我注释的那段,用那段确实可以启动微信,但是不能保证微信启动后就是最原始的消息列表,而是微信任何界面(用户上次操作微信停留的界面),这样在想做模拟点击的操作,要加好多的判断界面的代码和操作,那么能否我启动微信时一定在消息列表呢,答案是可以的,那就是用下面这个flag,在启动微信的时候肯定会到消息列表,省去了我们的操作。


Intent.FLAG_ACTIVITY_CLEAR_TOP

3.执行操作

通过AccessibilityService的onAccessibilityEvent(...)方法,我们可以获取到界面view的信息,用getRootInActiveWindow(),一步步通过view的id,来模拟操作,到发红包界面。

这里需要注意,微信在跳转到红包界面的时候是有一个dialog加载动画的,不少人在跳转到发红包界面时,通过getRootInActiveWindow()获取到的对象不是null就是节点信息不对,这是因为一个dialog快速加载过去了,部分机器能看一闪的效果,如果手机性能比较好,这个dialog可能就看不到,但是代码执行的时候就拿不到节点信息。

尝试过加延时,但是延时过后,onAccessibilityEvent方法不执行,还是等于没有。

这时候就需要用到开篇讲的了这段代码了:


android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"

加上这段代码后,我们就能通过onAccessibilityEvent来获取到发红包界面的view了,发一段在发红包界面填写金额的代码:


private void sendLuckMoney() {
   AccessibilityNodeInfo rootInfo = accessibilityService.getRootInActiveWindow();
   if (rootInfo != null) {
     List<AccessibilityNodeInfo> nodeInfoList = rootInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/clu");
     for (AccessibilityNodeInfo nodeInfo : nodeInfoList) {
       Bundle arguments = new Bundle();
       arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "10");
       nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);
     }

}
 }

来源:https://blog.csdn.net/dzy_mails/article/details/83688424

标签:AccessibilityService,微信,红包
0
投稿

猜你喜欢

  • SpringBoot实现Excel文件批量上传导入数据库

    2023-11-29 11:13:44
  • Android播放音乐案例分享

    2023-08-27 14:41:31
  • Springboot actuator生产就绪功能实现解析

    2021-07-23 12:57:06
  • C#设置软件开机自动运行的方法(修改注册表)

    2022-08-27 21:05:46
  • 一篇文章教你使用枚举来实现java单例模式

    2023-08-23 22:24:36
  • c#操作Redis的5种基本类型汇总

    2021-06-03 03:24:07
  • C#验证给定字符串形式日期是否合法的方法

    2021-09-15 16:00:37
  • 分享java中设置代理的两种方式

    2023-10-28 10:48:52
  • JAVA操作MongoDB数据库实例教程

    2023-11-18 13:22:27
  • Java多线程程序中synchronized修饰方法的使用实例

    2022-05-08 16:38:56
  • Java静态代理和动态代理的深入讲解

    2023-04-12 03:07:33
  • Android自定义控件EditText使用详解

    2023-11-06 12:52:15
  • ubuntu用wifi连接android调试程序的步骤

    2021-08-05 16:40:27
  • mybatis sum(参数) 列名作为参数的问题

    2022-06-16 01:45:44
  • 浅谈Java中复制数组的方式

    2022-04-14 23:30:27
  • JavaWeb搭建网上图书商城毕业设计

    2023-08-29 00:08:32
  • SpringBoot实现邮件发送功能的姿势分享

    2022-05-27 02:08:09
  • Android添加水印的正确方法 只要三步!

    2022-08-07 16:48:15
  • @TransactionalEventListener的使用和实现原理分析

    2022-01-19 06:15:11
  • Android startActivityForResult实例详解

    2021-07-18 00:50:33
  • asp之家 软件编程 m.aspxhome.com