AccessibilityService实现微信发红包功能

前端之家收集整理的这篇文章主要介绍了AccessibilityService实现微信发红包功能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

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

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

  1. public class TestAccessibilityService extends AccessibilityService {
  2. @Override
  3. public void onAccessibilityEvent(AccessibilityEvent event) {
  4. ...
  5. }
  6.  
  7. @Override
  8. public void onInterrupt() {
  9. VirtualControlManager.getInstance().onCancel();
  10. }
  11. }

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

  1. <service android:name=".TestAccessibilityService"
  2. android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
  3. android:label="@string/accessibility_service_label">
  4. <intent-filter>
  5. <action android:name="android.accessibilityservice.AccessibilityService" />
  6. </intent-filter>
  7.  
  8. <Meta-data
  9. android:name="android.accessibilityservice"
  10. android:resource="@xml/accessibility_service_config" />
  11.  
  12. </service>

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

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

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

  1. android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"

2.启动微信

  1. Intent intent = new Intent(Intent.ACTION_MAIN);
  2. // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent
  3. // .FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
  4.  
  5. //加这个flag为了让微信能够进入的时候在会话列表
  6. intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
  7.  
  8. intent.addCategory(Intent.CATEGORY_LAUNCHER);
  9. ComponentName cn = new ComponentName(“com.tencent.mm”,“com.tencent.mm.ui.LauncherUI”);
  10. intent.setComponent(cn);
  11. context.startActivity(intent);

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

  1. Intent.FLAG_ACTIVITY_CLEAR_TOP

3.执行操作

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

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

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

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

  1. android:accessibilityFlags="flagDefault|flagRetrieveInteractiveWindows|flagIncludeNotImportantViews"

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

  1. private void sendLuckMoney() {
  2. AccessibilityNodeInfo rootInfo = accessibilityService.getRootInActiveWindow();
  3. if (rootInfo != null) {
  4. List<AccessibilityNodeInfo> nodeInfoList = rootInfo.findAccessibilityNodeInfosByViewId("com.tencent.mm:id/clu");
  5. for (AccessibilityNodeInfo nodeInfo : nodeInfoList) {
  6. Bundle arguments = new Bundle();
  7. arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE,"10");
  8. nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT,arguments);
  9. }
  10.  
  11. }
  12. }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

猜你在找的Android相关文章