微信抢红包-AccessibilityService的用法。

先介绍下AccessibilityService。

结构

public abstract class AccessibilityService extends Service

 

java.lang.Object

android.content.Context

        android.content.ContextWrapper

               android.app.Service

                          android.accessibilityservice.AccessibilityService

 

类概述

当AccessibilityEvent事件被启动后AccessibilityService 会接收回调函数运行于后台,这些事件指的是在用户接口间的状态转换,比如,焦点变化,按钮被点击等。

一些辅助服务继承于此类并且实现它的抽象方法,像这样的一个服务和其他服务一样在AndroidManifest.xml中被声明但它必须被指定操纵“android.accessibilityservice.

AccessibilityService”的意图,


那么再来说下微信抢红包的主要思路。


MyAccessibilityService的实现代码

package com.cvte.weixinhb;

import android.accessibilityservice.AccessibilityService;
import android.app.Notification;
import android.app.PendingIntent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;
import java.util.List;

/**
 * Created by cvtpc on 2015/3/29.
 */
public class MyAccessibilityService extends AccessibilityService {

    private static final String WEIXINHONGBAO = "[微信红包]";
    private static final String GETWEIXINHONGBAO = "领取红包";
    private static final String OPENHONGBAO = "拆红包";
    private static final String WEIXINLINK = "[链接]";
    private static final String WEIXINDIDI = "滴滴";
    private Boolean isHongBao = true;
    private  Boolean isNeedfindParent = false;
    private static final String TAG = "MyAccessibilityService";
    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        Toast.makeText(this, "连接服务成功", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
        final int eventType = accessibilityEvent.getEventType();

        LogUtil.d(TAG,"--->"+accessibilityEvent);
        //这里是首先检测通知栏的变化
        if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
            List<CharSequence> textList = accessibilityEvent.getText();
            if (!textList.isEmpty()) {
                for (CharSequence t : textList) {
                    String str = t.toString();
                    if (str.contains(WEIXINHONGBAO)) {
                        isHongBao = true;
                        openWeiXin(accessibilityEvent);
                    }else if(str.contains(WEIXINDIDI)&&str.contains(WEIXINLINK)){
                        isHongBao = false;
                        openWeiXin(accessibilityEvent);
                    }
                }
            }
        }else if(eventType==AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
            openLink(accessibilityEvent);
        }

    }
    /**
     *  检测到有微信红包/滴滴的字样,打开微信
     * @param event
     */
    private void openWeiXin(AccessibilityEvent event) {
        if (event.getParcelableData() == null || !(event.getParcelableData() instanceof Notification)) {
            return;
        }
        Notification notification = (Notification) event.getParcelableData();
        PendingIntent contentIntent = notification.contentIntent;
        try {
            contentIntent.send();
        } catch (PendingIntent.CanceledException e) {
            e.printStackTrace();
        }
    }

    /**
     * 当检测到窗口的变化时,打开相应的连接
     */
    private void openLink(AccessibilityEvent event){
        if("com.tencent.mm.ui.LauncherUI".equals(event.getClassName())){
            isNeedfindParent = true;
            if(isHongBao){
                clickHB(isNeedfindParent,GETWEIXINHONGBAO);
            }else{
                clickHB(isNeedfindParent,WEIXINDIDI);
            }

        }else if("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI".equals(event.getClassName())){
            isNeedfindParent = false;
            clickHB(isNeedfindParent,OPENHONGBAO);
        }
    }


    /**
     * 点击领取红包
     */
    private void clickHB(boolean isNeedfindParent,String keyWord){
        AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
        if(nodeInfo!=null){
            List<AccessibilityNodeInfo> nodeInfoList = nodeInfo.findAccessibilityNodeInfosByText(keyWord);
            if(!nodeInfoList.isEmpty()){
                //获取最新的红包
                AccessibilityNodeInfo node = null;
                if(isHongBao){
                    node= nodeInfoList.get(nodeInfoList.size()-1);
                }else{
                    if(nodeInfoList.size()>2){
                        node = nodeInfoList.get(nodeInfoList.size()-2);
                    }

                }

                if(isNeedfindParent){
                    if(node!=null){
                        AccessibilityNodeInfo parentNode = node.getParent();
                        if(parentNode!=null){
                            LogUtil.d(TAG,"---->"+parentNode);
                            parentNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                        }
                    }else{
                        LogUtil.d(TAG,"node is null");
                    }

                }else{
                    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }

            }
        }

    }
    @Override
    public void onInterrupt() {

    }
}

Manifest配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.cvte.weixinhb" >

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <service android:name=".MyAccessibilityService"
            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/accessibilityservice" />
        </service>
    </application>

</manifest>
accessibilityservice内容

<?xml version="1.0" encoding="UTF-8"?>
<accessibility-service
    android:canRetrieveWindowContent="true"
    android:accessibilityFlags=""
    android:notificationTimeout="100"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:packageNames="com.tencent.mm"
    android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged"
    android:description="@string/accessibility_description"
    xmlns:android="http://schemas.android.com/apk/res/android"/>




  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值