去除反复,多余推断。调整条件语句顺序。去除日志打印。进一步提高抢红包速度。秒杀其它抢红包软件,红包抢到没朋友
关键代码
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