当前位置: 移动技术网 > IT编程>移动开发>Android > AccessibilityService实现微信发红包功能

AccessibilityService实现微信发红包功能

2020年03月09日  | 移动技术网IT编程  | 我要评论

欲望少女运动会攻略,邪恶少女漫画被囚禁,白逻彬

在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);
      }
 
    }
  }

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网