• 微信抢红包优化版


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



    关键代码

    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

  • 相关阅读:
    angularjs中的指令
    git笔记
    webpack.config.js
    webpack开发react常用插件和依赖
    angularjs中的分页指令
    angularjs中的排序和过滤
    react学习
    gulp学习
    Javascript 判断变量类型的陷阱 与 正确的处理方式
    Fn.bind.apply() 解决 new 操作符不能用与 apply 或 call 同时使用
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6907830.html
Copyright © 2020-2023  润新知