简单实现了微信自动抢红包的服务,原理就是根据关键字找到相应的View, 然后自动点击。主要是用到AccessibilityService这个辅助服务,基本可以满足自动抢红包的功能,但是有些逻辑需要优化,比如,拆完一个红包后,必须手动点击返回键,才能进行下一次自动抢红包。

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>                                                                                                                                                    
envelope_service_config.xml

<?xml version="1.0" encoding="utf-8"?>
activity_main.xml

    

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;/** * 

Created by Administrator

*

* 抢红包外挂服务 */public class EnvelopeService extends AccessibilityService { static final String TAG = "Jackie"; /** * 微信的包名 */ static final String WECHAT_PACKAGENAME = "com.tencent.mm"; /** * 红包消息的关键字 */ 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 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 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 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; } } } }}




更多相关文章

  1. tcping测试服务器TCP端口
  2. android service 例子(电话录音和获取系统当前时间)
  3. android 简单实现电话的监听
  4. getSystemService 的参数
  5. android 使用xmpp smack openfire实现即时通讯(一)
  6. 如何让android的service一直在后台运行
  7. 【Android】Service学习之本地服务
  8. Android端与服务端基于TCP/IP协议的Socket通讯
  9. Mars服务器和客户端demo运行教程

随机推荐

  1. 利用HTML5开发Android APP
  2. android ToolBar使用默认返回键,修改颜色
  3. android 7.0以上 安装本地apk
  4. Android音乐播放器制作 加入控制台(三)
  5. android http通信(二) 英译汉字典实例探
  6. 使用Vitamio打造自己的Android万能播放器
  7. android fragment的显示隐藏生命周期简述
  8. 第八节(Activity布局初步一)
  9. Android(安卓)刷脸神器,颜值价更高
  10. 自定义两行可左右滑动的GridView