微信抢红包优化版

去除反复,多余推断。调整条件语句顺序。去除日志打印。进一步提高抢红包速度。秒杀其它抢红包软件,红包抢到没朋友



关键代码

package com.example.hook;

import java.util.List;

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.os.Vibrator;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;

@SuppressLint("NewApi")
public class HookService extends AccessibilityService {

	/**
	 * 当通知栏改变或界面改变时会触发该方法
	 */
	@Override
	public void onAccessibilityEvent(AccessibilityEvent event) {
		if (event == null)
			return;

		if (event.getEventType() == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {

			List<CharSequence> texts = event.getText();
		
			for (CharSequence t : texts) {

				if (t.toString().contains("[微信红包]")) {// 获取通知栏字符,若包括 [微信红包]
														// 则模拟手指点击事件
					handleNotificationChange(event);
					break;
				}
			}
			
		}

		/**
		 * 以下内容能够借助 Dump View Hierarchy For UI Automator 去分析微信UI结构
		 */
		if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {

			// System.out.println("TYPE_WINDOW_STATE_CHANGED --> "+event.getClassName());
			if ("com.tencent.mm.ui.LauncherUI".equals(event.getClassName())) {
				// 在聊天界面,去点中红包
				checkKey2();
			} else if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI"
					.equals(event.getClassName())) {
				// 点中了红包,下一步就是去拆红包
				checkKey1();
			} else if ("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI"
					.equals(event.getClassName())) {
				// 拆完红包后看具体的纪录界面
				
				Intent intent = new Intent();
				intent.setAction(Intent.ACTION_MAIN);
				intent.addCategory(Intent.CATEGORY_HOME);
				intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
				startActivity(intent);
			
				// ((Vibrator)getSystemService(Context.VIBRATOR_SERVICE)).vibrate(500);
			}

		}
	}

	private void checkKey1() {
		AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
		if (nodeInfo == null) {
		
			return;
		}
		List<AccessibilityNodeInfo> list = nodeInfo
				.findAccessibilityNodeInfosByText("拆红包"); // 获取包括 拆红包
															// 文字的控件,模拟点击事件,拆开红包
		for (AccessibilityNodeInfo n : list) {
			n.performAction(AccessibilityNodeInfo.ACTION_CLICK);
		}
	}

	@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
	private void checkKey2() {
		AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
		if (nodeInfo == null) {
		
			return;
		}
		List<AccessibilityNodeInfo> list = nodeInfo
				.findAccessibilityNodeInfosByText("领取红包"); // 找到聊天界面中包括 领取红包
															// 字符的控件
		if (list.isEmpty()) {
			list = nodeInfo.findAccessibilityNodeInfosByText("[微信红包]");
			for (AccessibilityNodeInfo n : list) {
			
				n.performAction(AccessibilityNodeInfo.ACTION_CLICK);
				break;
			}
		} else {
			// 最新的红包领起
			for (int i = list.size() - 1; i >= 0; i--) {
				AccessibilityNodeInfo parent = list.get(i).getParent();
			
				try {
					// 调用performAction(AccessibilityNodeInfo.ACTION_CLICK)触发点击事件
					parent.performAction(AccessibilityNodeInfo.ACTION_CLICK);
					
					return;
				} catch (Exception e) {
					
					e.printStackTrace();
				}

			}
		}

	}

	public void handleNotificationChange(AccessibilityEvent event) {
		try {
			
			Notification notification = (Notification) event
					.getParcelableData();
			
			PendingIntent pendingIntent = notification.contentIntent;

			pendingIntent.send(); // 点击通知栏消息
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	
	}

	@Override
	public void onInterrupt() {
		// TODO Auto-generated method stub

	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		// TODO Auto-generated method stub
		return super.onStartCommand(intent, START_STICKY, startId);
	}
}



主Activity

package com.example.hook;


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

	Button qidong;
	TextView info;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		startService(new Intent(getApplicationContext(), HookService.class));
		
		
		qidong=(Button) findViewById(R.id.qidong);
		info=(TextView) findViewById(R.id.info);
		qidong.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				// TODO Auto-generated method stub
				Toast.makeText(getApplicationContext(), "请开启  疯狂抢红包BY Young", 1).show();
				startActivity(new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS));
			}
		});
	}
	
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
		if (isAccessibilitySettingsOn(getApplicationContext())) {
			qidong.setText("已启动  疯狂抢红包BY Young");
			info.setText("已开启自己主动抢红包模式。您能够后台执行该APP,同一时候开启 微信接收新消息通知,并后台执行微信,同一时候屏幕保持常亮");
		}else{
			info.setText("");
			qidong.setText("点击开启   疯狂抢红包BY Young");
		}
	}
	
	// To check if service is enabled
		public   boolean isAccessibilitySettingsOn(Context context) {
			int accessibilityEnabled = 0;
			final String service = context.getPackageName() + "/" + HookService.class.getName();
			boolean accessibilityFound = false;
			try {
				accessibilityEnabled = Settings.Secure.getInt(context.getApplicationContext().getContentResolver(), android.provider.Settings.Secure.ACCESSIBILITY_ENABLED);
			} catch (SettingNotFoundException e) {
			}
			TextUtils.SimpleStringSplitter mStringColonSplitter = new TextUtils.SimpleStringSplitter(':');
			if (accessibilityEnabled == 1) {
				String settingValue = Settings.Secure.getString(context.getApplicationContext().getContentResolver(), Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES);
				if (settingValue != null) {
					TextUtils.SimpleStringSplitter splitter = mStringColonSplitter;
					splitter.setString(settingValue);
					while (splitter.hasNext()) {
						String accessabilityService = splitter.next();
						if (accessabilityService.equalsIgnoreCase(service)) {
							return true;
						}
					}
				}
			} else {
				// Log.v(TAG, "***ACCESSIBILIY IS DISABLED***");
			}

			return accessibilityFound;
		}
}




布局

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:padding="10dp" >

        <TextView
            android:id="@+id/tip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="miui用户请去  安全中心  --授权管理 --自启动管理  中同意 疯狂抢红包BY Young 自己主动启动。否则可能因内存不足导致应用被杀死
ps: 收到红包后会自己主动返回桌面
该APP适用于微信6.2.4"
            android:textColor="#000" />

        
        <Button
            android:id="@+id/qidong"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColor="#000" 
            android:layout_marginBottom="20dp"/>

        
        <TextView
            android:id="@+id/info"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:textColor="#000" />
        
        <ImageView
            
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/img2" />

        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/img1" />
        <ImageView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:src="@drawable/img3" />
    </LinearLayout>

</ScrollView>


清单文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.hook"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="21" />

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

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <service android:name="com.example.hook.HookService" 
              android:canRetrieveWindowContent="true"
          
            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" />
        </service>
        
        
        
        <receiver android:name="com.example.hook.Receiver">  
            <intent-filter>  
                <!-- 应用卸载 -->  
                <action android:name="android.intent.action.PACKAGE_REMOVED"/>  
                <data android:scheme="package"/>  
            </intent-filter>  
            <intent-filter>  
                <!-- 开机 -->  
                <action android:name="android.intent.action.BOOT_COMPLETED"/>  
                <!-- 解锁 -->  
                <action android:name="android.intent.action.USER_PRESENT" />  
            </intent-filter>  
        </receiver>  
        
    </application>
    <uses-permission android:name="android.permission.VIBRATE" />  
 <uses-permission android:name="android.permission.BIND_ACCESSIBILITY_SERVICE" />
    <uses-permission android:name="android.permission.GET_TASKS" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />  
</manifest>



配置文件   res下xml文件里

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



完整project   http://pan.baidu.com/s/1gdnQXur

原文地址:https://www.cnblogs.com/yjbjingcha/p/6907830.html