Android 抢红包

  最近有要实现微信抢红包的需求,用的AccessibilityService实现,其实网上已经很多这方面的教程,本文纯粹是为了自己记录一下,也是纯粹的学习目的!
  实现自动抢红包的原理,是借助Android的辅助服务AccessibilityService,这个服务是Android为部分使用者更方便的与手机交互。该服务的功能很强大,我们就通过抢红包来学习它吧。
  第一步在AndroidManifest.xml文件中配置:
  

<service
            android:name=".LuckMoneyAccessibilityService"
            android:enabled="true"
            android:exported="true"
            android:label="@string/label"
            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="@xml/config_luckmoney_service" />
        service>

  config_luckmoney_service文件是AccessibilityService的配置文件,具体可以看官网:
  


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

  下面来看看需要重写的方法:
  

@Override  
public void onAccessibilityEvent(AccessibilityEvent event) {  
    //接收事件,如触发了通知栏变化、界面变化等 抢红包的操作都在这里     
}  

@Override  
protected boolean onKeyEvent(KeyEvent event) {  
    //接收按键事件  
    return super.onKeyEvent(event);  
}  

@Override  
public void onInterrupt() {  
  //服务中断,如服务被杀死  
}   

  贴出项目代码地址https://github.com/hgchenkai/LuckyMoney ,具体的实现可以看源码。
  抢红包大致流程:
            Android 抢红包_第1张图片

  1.如果当前页面不是微信消息列表界面,收到通知消息推送通知,判断通知栏里的消息是否有[微信红包]的关键字,有则可以判断为用户收到红包的消息。接着自动化触发这个消息的意图事件(Intent)。
  2.第一步正常情况会跳转到com.tencent.mm.ui.LauncherUI界面。红包的消息中包括了关键字”领取红包”,我们就可以根据这个关键字找到相应的View,然后再触发ACTION_CLICK事件,跳转拆红包页面;
  3.上一步会跳到
  com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI这个拆红包页面,同第二步通过关键字或者view的id,来找相应的View,然后在自动触发ACTION_CLICK事件来拆红包。
  这里再简单介绍一下怎么获取view的id。通过DDMS的Dump View Hierarchy For UI Automator可以很容易的得到。(如果是Android Studio DDMS工具是在tools-》Android-》Android Device Monitor):
  
      Android 抢红包_第2张图片

  我的微信版本是6.5.3的,其拆红包的button对应的id是com.tencent.mm:id/be_ 。有了这个id就可以找到相应的View(这里就是这个开红包的button)。然后接着AccessibilityService的辅助功能去自动点击这个button,这样就可以实现抢红包了。这辅助功能真的很强大,多说无益,Read the f**k source code!然后自己创建项目试试吧!
  最后Demo的使用,在主界面点击开启抢红包会跳转如下界面:

       Android 抢红包_第3张图片
       
  开启LuckyMoneyAccessibilityService服务就好了。
  

你可能感兴趣的:(Android,View)