├── .gitignore ├── .idea ├── compiler.xml ├── copyright │ └── profiles_settings.xml ├── gradle.xml ├── misc.xml ├── modules.xml └── runConfigurations.xml ├── 6.3.32.apk ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── air │ │ └── hongbaoauto │ │ └── ApplicationTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── air │ │ │ └── hongbaoauto │ │ │ └── AccessibilityService │ │ │ ├── AirAccessibilityService.java │ │ │ └── AirActivity.java │ └── res │ │ ├── layout │ │ └── activity_qhb.xml │ │ ├── mipmap-hdpi │ │ └── ic_launcher.png │ │ ├── mipmap-mdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxhdpi │ │ └── ic_launcher.png │ │ ├── mipmap-xxxhdpi │ │ └── ic_launcher.png │ │ ├── values-w820dp │ │ └── dimens.xml │ │ ├── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ └── accessibility_service_config.xml │ └── test │ └── java │ └── com │ └── air │ └── hongbaoauto │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── hongbao6.5.3.apk └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/workspace.xml 5 | /.idea/libraries 6 | .DS_Store 7 | /build 8 | /captures 9 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /.idea/copyright/profiles_settings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 18 | 19 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 12 | 13 | 14 | 26 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | Android 46 | 47 | 48 | Android > Lint > Correctness 49 | 50 | 51 | Java 52 | 53 | 54 | Java language level migration aidsJava 55 | 56 | 57 | 58 | 59 | AndroidLintUsesMinSdkAttributes 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 81 | 82 | 83 | 84 | 85 | 86 | 91 | 92 | 93 | 94 | 95 | 96 | 1.8 97 | 98 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 125 | 126 | 127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /6.3.32.apk: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/AndroidMsky/WXhongbao/0a5aa75dd9bc1d7bbb8bf0dadedcf926b19b622d/6.3.32.apk -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # WXhongbao 2 | 自动领取微信红包,支持锁屏聊天界面等各种情况 3 | 4 | 转载请注明作者AndroidMSky和链接http://blog.csdn.net/AndroidMsky/article/details/53490459 5 | 6 | 又是兴趣系列 7 | 8 | 9 | 欢迎star欢迎fork issue 10 | 网上有很多自动强红包的例子和代码,笔者也是做了一些优化。 11 | 12 | 先说说自己的两个个优势 13 | 14 | 1.可以在聊天界面自动强不依赖于通知栏推送 15 | 16 | 2.可以在屏幕熄灭的时候的时候点亮屏幕自动抢(目前只测过flyme) 17 | 先上图: 18 | 19 | 20 | ![这里写图片描述](http://img.blog.csdn.net/20161207095742232?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQW5kcm9pZE1za3k=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) 21 | 22 | 微信6.3.32体验APK 23 | https://github.com/AndroidMsky/WXhongbao/raw/master/6.3.32.apk 24 | 25 | 26 | ## License 27 | 28 | Copyright 2016 AndroidMsky 29 | 30 | Licensed under the Apache License, Version 2.0 (the "License"); 31 | you may not use this file except in compliance with the License. 32 | You may obtain a copy of the License at 33 | 34 | http://www.apache.org/licenses/LICENSE-2.0 35 | 36 | Unless required by applicable law or agreed to in writing, software 37 | distributed under the License is distributed on an "AS IS" BASIS, 38 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 39 | See the License for the specific language governing permissions and 40 | limitations under the License. 41 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 23 5 | buildToolsVersion "23.0.2" 6 | 7 | defaultConfig { 8 | applicationId "com.lmt.hongbao" 9 | minSdkVersion 16 10 | targetSdkVersion 23 11 | versionCode 1 12 | versionName "1.0" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | } 21 | 22 | dependencies { 23 | compile fileTree(dir: 'libs', include: ['*.jar']) 24 | testCompile 'junit:junit:4.12' 25 | compile 'com.android.support:appcompat-v7:23.0.1' 26 | } 27 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in E:\Eclipse\android-studio-sdk\android-sdk-windows/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/air/hongbaoauto/ApplicationTest.java: -------------------------------------------------------------------------------- 1 | package com.air.hongbaoauto; 2 | 3 | import android.app.Application; 4 | import android.test.ApplicationTestCase; 5 | 6 | /** 7 | * Testing Fundamentals 8 | */ 9 | public class ApplicationTest extends ApplicationTestCase { 10 | public ApplicationTest() { 11 | super(Application.class); 12 | } 13 | } -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 28 | 29 | 30 | 31 | 32 | 35 | 36 | 37 | 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/air/hongbaoauto/AccessibilityService/AirAccessibilityService.java: -------------------------------------------------------------------------------- 1 | package com.air.hongbaoauto.AccessibilityService; 2 | 3 | import android.accessibilityservice.AccessibilityService; 4 | import android.annotation.TargetApi; 5 | import android.app.KeyguardManager; 6 | import android.app.Notification; 7 | import android.app.PendingIntent; 8 | import android.content.Context; 9 | import android.os.Build; 10 | import android.os.PowerManager; 11 | import android.util.Log; 12 | import android.view.accessibility.AccessibilityEvent; 13 | import android.view.accessibility.AccessibilityNodeInfo; 14 | 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | 18 | 19 | public class AirAccessibilityService extends AccessibilityService { 20 | 21 | public static boolean ALL = false; 22 | private List parents; 23 | private boolean auto = false; 24 | private int lastbagnum; 25 | String pubclassName; 26 | String lastMAIN; 27 | private boolean WXMAIN = false; 28 | 29 | private boolean enableKeyguard = true;//默认有屏幕锁 30 | private KeyguardManager km; 31 | private KeyguardManager.KeyguardLock kl; 32 | //唤醒屏幕相关 33 | private PowerManager pm; 34 | private PowerManager.WakeLock wl = null; 35 | @Override 36 | protected void onServiceConnected() { 37 | super.onServiceConnected(); 38 | parents = new ArrayList<>(); 39 | 40 | } 41 | 42 | @Override 43 | public void onAccessibilityEvent(AccessibilityEvent event) { 44 | int eventType = event.getEventType(); 45 | if (auto) 46 | Log.e("AAAAAAAA", "有事件" + eventType); 47 | switch (eventType) { 48 | //当通知栏发生改变时 49 | case 2048: 50 | pubclassName = event.getClassName().toString(); 51 | 52 | Log.e("AAAAAAAA", "有2048事件" + pubclassName + auto); 53 | 54 | if (!auto && pubclassName.equals("android.widget.TextView") && ALL) { 55 | Log.e("AAAAAAAA", "有2048事件被识别" + auto + pubclassName); 56 | getLastPacket(1); 57 | } 58 | if (auto && WXMAIN) { 59 | getLastPacket(); 60 | auto = false; 61 | } 62 | 63 | break; 64 | case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: 65 | 66 | Log.e("AAAAAAAA", "youtongzhi"); 67 | List texts = event.getText(); 68 | if (!texts.isEmpty()) { 69 | for (CharSequence text : texts) { 70 | String content = text.toString(); 71 | Log.e("AAAAAAAA", "youtongzhi"+content); 72 | if (content.contains("微信红包")) { 73 | if (event.getParcelableData() != null && 74 | event.getParcelableData() instanceof Notification) { 75 | Notification notification = (Notification) event.getParcelableData(); 76 | PendingIntent pendingIntent = notification.contentIntent; 77 | try { 78 | auto = true; 79 | wakeAndUnlock2(true); 80 | pendingIntent.send(); 81 | Log.e("AAAAAAAA", "进入微信" + auto + event.getClassName().toString()); 82 | } catch (Exception e) { 83 | e.printStackTrace(); 84 | } 85 | } 86 | } 87 | } 88 | } 89 | break; 90 | //当窗口的状态发生改变时 91 | case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: 92 | String className = event.getClassName().toString(); 93 | if (className.equals("com.tencent.mm.ui.LauncherUI")) { 94 | //点击最后一个红包 95 | Log.e("AAAAAAAA", "点击红包"); 96 | if (auto) 97 | getLastPacket(); 98 | auto = false; 99 | WXMAIN = true; 100 | } else if (className.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI")) { 101 | //开红包6.5.3 be_ 102 | // 6.3.32bdh 103 | Log.e("AAAAAAAA", "开红包"); 104 | click("com.tencent.mm:id/bdh"); 105 | auto = false; 106 | WXMAIN = false; 107 | } else if (className.equals("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI")) { 108 | //退出红包 109 | Log.e("AAAAAAAA", "退出红包"); 110 | click("com.tencent.mm:id/gq"); 111 | WXMAIN = false; 112 | 113 | } else { 114 | WXMAIN = false; 115 | lastMAIN = className; 116 | } 117 | break; 118 | } 119 | } 120 | 121 | @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2) 122 | private void click(String clickId) { 123 | AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); 124 | if (nodeInfo != null) { 125 | List list = nodeInfo.findAccessibilityNodeInfosByViewId(clickId); 126 | for (AccessibilityNodeInfo item : list) { 127 | item.performAction(AccessibilityNodeInfo.ACTION_CLICK); 128 | } 129 | } 130 | } 131 | 132 | private void getLastPacket() { 133 | 134 | AccessibilityNodeInfo rootNode = getRootInActiveWindow(); 135 | recycle(rootNode); 136 | Log.e("AAAAAAAA", "当前页面红包数老方法" + parents.size()); 137 | if (parents.size() > 0) { 138 | parents.get(parents.size() - 1).performAction(AccessibilityNodeInfo.ACTION_CLICK); 139 | lastbagnum = parents.size(); 140 | parents.clear(); 141 | } 142 | } 143 | 144 | private void getLastPacket(int c) { 145 | 146 | Log.e("AAAAAAAA", "新方法" + parents.size()); 147 | AccessibilityNodeInfo rootNode = getRootInActiveWindow(); 148 | recycle(rootNode); 149 | Log.e("AAAAAAAA", "last++" + lastbagnum + "当前页面红包数" + parents.size()); 150 | if (parents.size() > 0 && WXMAIN) { 151 | Log.e("AAAAAAAA", "页面大于O且在微信界面"); 152 | if (lastbagnum < parents.size()) 153 | parents.get(parents.size() - 1).performAction(AccessibilityNodeInfo.ACTION_CLICK); 154 | lastbagnum = parents.size(); 155 | parents.clear(); 156 | } 157 | } 158 | 159 | public void recycle(AccessibilityNodeInfo info) { 160 | try { 161 | if (info.getChildCount() == 0) { 162 | if (info.getText() != null) { 163 | if ("领取红包".equals(info.getText().toString())) { 164 | if (info.isClickable()) { 165 | info.performAction(AccessibilityNodeInfo.ACTION_CLICK); 166 | } 167 | AccessibilityNodeInfo parent = info.getParent(); 168 | while (parent != null) { 169 | if (parent.isClickable()) { 170 | parents.add(parent); 171 | break; 172 | } 173 | parent = parent.getParent(); 174 | } 175 | } 176 | } 177 | } else { 178 | for (int i = 0; i < info.getChildCount(); i++) { 179 | if (info.getChild(i) != null) { 180 | recycle(info.getChild(i)); 181 | } 182 | } 183 | } 184 | } catch (Exception e) { 185 | 186 | 187 | } 188 | } 189 | private void wakeAndUnlock2(boolean b) 190 | { 191 | if(b) 192 | { 193 | //获取电源管理器对象 194 | pm=(PowerManager) getSystemService(Context.POWER_SERVICE); 195 | 196 | //获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的Tag 197 | wl = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright"); 198 | 199 | //点亮屏幕 200 | wl.acquire(); 201 | 202 | //得到键盘锁管理器对象 203 | km= (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE); 204 | kl = km.newKeyguardLock("unLock"); 205 | 206 | //解锁 207 | kl.disableKeyguard(); 208 | } 209 | else 210 | { 211 | //锁屏 212 | kl.reenableKeyguard(); 213 | 214 | //释放wakeLock,关灯 215 | wl.release(); 216 | } 217 | 218 | } 219 | 220 | @Override 221 | public void onInterrupt() { 222 | 223 | } 224 | } 225 | -------------------------------------------------------------------------------- /app/src/main/java/com/air/hongbaoauto/AccessibilityService/AirActivity.java: -------------------------------------------------------------------------------- 1 | package com.air.hongbaoauto.AccessibilityService; 2 | 3 | import android.content.Intent; 4 | import android.provider.Settings; 5 | import android.support.v7.app.AppCompatActivity; 6 | import android.os.Bundle; 7 | import android.view.View; 8 | import android.widget.Button; 9 | 10 | import com.air.hongbaoauto.R; 11 | 12 | public class AirActivity extends AppCompatActivity { 13 | 14 | @Override 15 | protected void onCreate(Bundle savedInstanceState) { 16 | super.onCreate(savedInstanceState); 17 | setContentView(R.layout.activity_qhb); 18 | 19 | Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS); 20 | startActivity(intent); 21 | } 22 | 23 | public void start(View v) { 24 | if (AirAccessibilityService.ALL) { 25 | AirAccessibilityService.ALL = false; 26 | ((Button) v).setText("对话内监控+关"); 27 | } else { 28 | AirAccessibilityService.ALL = true; 29 | ((Button) v).setText("对话内监控+开"); 30 | } 31 | ; 32 | 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_qhb.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 |