花门楼前见秋草,岂能贫贱相看老。这篇文章主要讲述Android实现微信自己主动抢红包的程序相关的知识,希望能为你提供帮助。
简单实现了微信自己主动抢红包的服务,原理就是依据keyword找到对应的View, 然后自己主动点击。主要是用到AccessibilityService这个辅助服务,基本能够满足自己主动抢红包的功能,可是有些逻辑须要优化,比方,拆完一个红包后,必须手动点击返回键,才干进行下一次自己主动抢红包。
androidManifest.xml
< ?xml version=" 1.0" encoding=" utf-8" ?> < manifest xmlns:android=" http://schemas.android.com/apk/res/android" package=" com.jackie.webchatenvelope" > < application android:allowBackup=" true" android:icon=" @mipmap/ic_launcher" android:label=" @string/app_name" android:theme=" @style/AppTheme" > < activity android:name=" .MainActivity" android:label=" @string/app_name" > < intent-filter> < action android:name=" android.intent.action.MAIN" /> < category android:name=" android.intent.category.LAUNCHER" /> < /intent-filter> < /activity> < service android:enabled=" true" android:exported=" true" android:label=" @string/app_name" android:name=" .EnvelopeService" 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/envelope_service_config" /> < /service> < /application> < /manifest>
envelope_service_config.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/accessibility_description" android:notificationTimeout=" 100" android:packageNames=" com.tencent.mm" />
activity_main.xml
< RelativeLayout 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" android:paddingBottom=" @dimen/activity_vertical_margin" android:paddingLeft=" @dimen/activity_horizontal_margin" android:paddingRight=" @dimen/activity_horizontal_margin" android:paddingTop=" @dimen/activity_vertical_margin" tools:context=" .MainActivity" > < Button android:id=" @+id/start" android:layout_width=" wrap_content" android:layout_height=" wrap_content" android:padding=" 10dp" android:layout_centerInParent=" true" android:textSize=" 18sp" android:text=" 打开辅助服务" /> < /RelativeLayout>
MainActivity.java
package com.jackie.webchatenvelope; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private Button startBtn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); startBtn = (Button) findViewById(R.id.start); startBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { //打开系统设置中辅助功能 Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS); startActivity(intent); Toast.makeText(MainActivity.this, " 找到抢红包,然后开启服务就可以" , Toast.LENGTH_LONG).show(); } catch (Exception e) { e.printStackTrace(); } } }); }@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.menu_main, menu); return true; }@Override public boolean onOptionsItemSelected(MenuItem item) { // Handle action bar item clicks here. The action bar will // automatically handle clicks on the Home/Up button, so long // as you specify a parent activity in AndroidManifest.xml. int id = item.getItemId(); //noinspection SimplifiableIfStatement if (id == R.id.action_settings) { return true; }return super.onOptionsItemSelected(item); } }
EnvelopeService.java
package com.jackie.webchatenvelope; import android.accessibilityservice.AccessibilityService; import android.annotation.TargetApi; import android.app.Notification; import android.app.PendingIntent; import android.os.Build; import android.os.Handler; import android.util.Log; import android.view.accessibility.AccessibilityEvent; import android.view.accessibility.AccessibilityManager; import android.view.accessibility.AccessibilityNodeInfo; import android.widget.Toast; import java.util.List; /** * < p> Created by Administrator< /p> * < p/> * 抢红包外挂服务 */ public class EnvelopeService extends AccessibilityService {static final String TAG = " Jackie" ; /** * 微信的包名 */ static final String WECHAT_PACKAGENAME = " com.tencent.mm" ; /** * 红包消息的keyword */ static final String ENVELOPE_TEXT_KEY = " [微信红包]" ; Handler handler = new Handler(); @Override public void onAccessibilityEvent(AccessibilityEvent event) { final int eventType = event.getEventType(); Log.d(TAG, " 事件----> " + event); //通知栏事件 if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) { List< CharSequence> texts = event.getText(); if (!texts.isEmpty()) { for (CharSequence t : texts) { String text = String.valueOf(t); if (text.contains(ENVELOPE_TEXT_KEY)) { openNotification(event); break; } } } } else if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) { openEnvelope(event); } }/*@Override protected boolean onKeyEvent(KeyEvent event) { //return super.onKeyEvent(event); return true; }*/@Override public void onInterrupt() { Toast.makeText(this, " 中断抢红包服务" , Toast.LENGTH_SHORT).show(); }@Override protected void onServiceConnected() { super.onServiceConnected(); Toast.makeText(this, " 连接抢红包服务" , Toast.LENGTH_SHORT).show(); }private void sendNotificationEvent() { AccessibilityManager manager = (AccessibilityManager) getSystemService(ACCESSIBILITY_SERVICE); if (!manager.isEnabled()) { return; } AccessibilityEvent event = AccessibilityEvent.obtain(AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED); event.setPackageName(WECHAT_PACKAGENAME); event.setClassName(Notification.class.getName()); CharSequence tickerText = ENVELOPE_TEXT_KEY; event.getText().add(tickerText); manager.sendAccessibilityEvent(event); }/** * 打开通知栏消息 */ @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void openNotification(AccessibilityEvent event) { if (event.getParcelableData() == null || !(event.getParcelableData() instanceof Notification)) { return; } //下面是精华,将微信的通知栏消息打开 Notification notification = (Notification) event.getParcelableData(); PendingIntent pendingIntent = notification.contentIntent; try { pendingIntent.send(); } catch (PendingIntent.CanceledException e) { e.printStackTrace(); } }@TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void openEnvelope(AccessibilityEvent event) { if (" com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI" .equals(event.getClassName())) { //点中了红包,下一步就是去拆红包 checkKey1(); } else if (" com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyDetailUI" .equals(event.getClassName())) { //拆完红包后看具体的纪录界面 //nonething } else if (" com.tencent.mm.ui.LauncherUI" .equals(event.getClassName())) { //在聊天界面,去点中红包 checkKey2(); } }@TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void checkKey1() { AccessibilityNodeInfo nodeInfo = getRootInActiveWindow(); if (nodeInfo == null) { Log.w(TAG, " rootWindow为空" ); 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) { Log.w(TAG, " rootWindow为空" ); return; } List< AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(" 领取红包" ); if (list.isEmpty()) { list = nodeInfo.findAccessibilityNodeInfosByText(ENVELOPE_TEXT_KEY); for (AccessibilityNodeInfo n : list) { Log.i(TAG, " --> 微信红包:" + n); n.performAction(AccessibilityNodeInfo.ACTION_CLICK); break; } } else { //最新的红包领起 for (int i = list.size() - 1; i > = 0; i--) { AccessibilityNodeInfo parent = list.get(i).getParent(); Log.i(TAG, " --> 领取红包:" + parent); if (parent != null) { parent.performAction(AccessibilityNodeInfo.ACTION_CLICK); break; } } } } }
【Android实现微信自己主动抢红包的程序】
推荐阅读
- Java服务器对外提供接口以及Android端向服务器请求数据
- android 利用cmdline,将參数从preloader传递到kernel
- android 清除缓存功能
- 《Android Studio开发实战 从零基础到App上线》资源下载和内容勘误
- Android复杂表格如何实现()
- Android 带清除功能的输入框控件EditTextWithDel
- Application Architecture Determines ApplicationPerformance
- Android自动化测试探索
- jQuery中的append()和prepend(),after()和before()的差别