去除重复,多余判断,调整条件语句顺序,去除日志打印,进一步提高抢红包速度,秒杀其他抢红包软件,红包抢到没朋友
关键代码
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 自动启动,否则可能因内存不足导致应用被杀死\nps: 收到红包后会自动返回桌面\n该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" />