当前位置 主页 > 网站技术 > 代码类 >

    AccessibilityService实现微信发红包功能

    栏目:代码类 时间:2019-12-14 18:10

    在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:andro
      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,在启动微信的时候肯定会到消息列表,省去了我们的操作。