基本信息
源码名称:<赞>android 抢QQ红包源码下载(红包机器人)
源码大小:0.32M
文件格式:.zip
开发语言:Java
更新时间:2016-01-28
   友情提示:(无需注册或充值,赞助后即可获取资源下载链接)

     嘿,亲!知识可是无价之宝呢,但咱这精心整理的资料也耗费了不少心血呀。小小地破费一下,绝对物超所值哦!如有下载和支付问题,请联系我们QQ(微信同号):813200300

本次赞助数额为: 2 元 
   源码介绍

一款QQ抢红包软件的源码,包含打开加Q群页面, 打开QQ会话窗口功能

核心service代码:


package com.moyan.hongbao.service;

import java.util.List;
import java.util.ArrayList;

import android.app.Notification;
import android.app.PendingIntent;
import android.app.KeyguardManager; 
import android.app.KeyguardManager.KeyguardLock; 
import android.content.Intent;
import android.content.Context;
import android.os.Build;
import android.os.PowerManager;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityManager;
import android.view.accessibility.AccessibilityNodeInfo;
import android.util.Log;



public class HongBaoService extends AccessibilityService {
	private static final String TAG = "QiangHongBao";
    private static final String QQ_CLASSNAME_CHAT = "com.tencent.mobileqq.activity.SplashActivity";
    private static final String QQ_CLASSNAME_WALLET = "cooperation.qwallet.plugin.QWalletPluginProxyActivity";
    private static final String QQ_KEYWORD_NOTIFICATION = "[QQ红包]";
    private static final String[] QQ_KEYWORD_HONGBAO= new String[]{"点击拆开","口令红包"};
    private static final String[] QQ_KEYWORD_SEND_LIST= new String[]{"点击输入口令","发送"};
    private static final String QQ_KEYWORD_FAILD_CLICK= "已拆开";
	/*
	 *静态变量来保存戳口令红包时第2步和第3步的节点
	 *避免每次都进行查找,提高戳红包效率
	 */
	private static List<AccessibilityNodeInfo> sendNodeList;
	//返回状态,判断是否需要戳返回键
	private boolean isNeedBack=false;
	//运行状态,从开始戳红包到结束时,不应该再有其它操作
	private boolean runState=false;
	//窗口状态,这个主要是区分窗口状态改变和内容改变时对屏幕的读取
	private boolean windowState=false;
	
	
	// 键盘管理器 
    private KeyguardManager mKeyguardManager; 
    // 键盘锁 
    private KeyguardLock mKeyguardLock; 
    // 电源管理器 
    private PowerManager mPowerManager; 
    // 唤醒锁 
    private PowerManager.WakeLock mWakeLock; 
	
	long time;

	@Override
    protected void onServiceConnected() {
        super.onServiceConnected();
    }
	
	@Override
	public void onAccessibilityEvent(AccessibilityEvent event) {
		if (event.getEventType()==AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
			List<CharSequence> texts = event.getText();
			if (!texts.isEmpty()) {
				for (CharSequence text : texts) {
					String content = text.toString();
					if (content.contains(QQ_KEYWORD_NOTIFICATION)) {
						openNotify(event);
						return;
					}
				}
			}
		}
		openHongBao(event);
	}
	
	
	@Override
	public void onInterrupt() {
	} 


    /** 打开通知栏消息*/
    private void openNotify(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();
        }
    }
	
	private void openHongBao(AccessibilityEvent event){
		String className=event.getClassName().toString();
		Log.i(TAG,className);
        if(className.equals(QQ_CLASSNAME_WALLET)&&isNeedBack){
			performGlobalAction(AccessibilityService.GLOBAL_ACTION_BACK);
			isNeedBack=false;
		}else if(className.equals(QQ_CLASSNAME_CHAT)||(event.getEventType()==AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED&&windowState)) {
			//wakeAndUnlock(true);
			windowState=true;
			if(!runState){
				AccessibilityNodeInfo info = event.getSource();
				if(info == null)  return;
				getAllHongBao(info);
			}
        }else{
			windowState=false;
		}
	}
	
	private void onClick(){
		if(sendNodeList==null||sendNodeList.size()==0){
			AccessibilityNodeInfo info = getRootInActiveWindow();
			if(info == null)  return;
			sendNodeList=new ArrayList<AccessibilityNodeInfo>();
			for(String s:QQ_KEYWORD_SEND_LIST){
				List<AccessibilityNodeInfo> infolist  = info.findAccessibilityNodeInfosByText(s);
				if(infolist.isEmpty()){
					/**
					 *这里如果没查找到
					 *说明前面查找到的节点不对
					 * 再继续查找显然并没有什么卵用
					 */
					return;
				}
				for(AccessibilityNodeInfo node:infolist){
					if(node.getText()==null||!node.getText().toString().equals(s)) continue;
					sendNodeList.add(node);
				}
			}
		}
		for(AccessibilityNodeInfo node:sendNodeList){
			AccessibilityNodeInfo in=getClickableNode(node);
			if(in==null) continue;
			Log.i(TAG,"模拟点击>>>" node.getText().toString());
			in.performAction(AccessibilityNodeInfo.ACTION_CLICK);
		}
		isNeedBack=true;
	}
	
	private void getAllHongBao(AccessibilityNodeInfo info){
		runState=true;
		Log.i(TAG,"获取所有红包");
		time=System.currentTimeMillis();
		List<AccessibilityNodeInfo> list=new ArrayList<AccessibilityNodeInfo>();
		//查找出当前页面所有的红包,包括手气红包和口令红包
		for(String word:QQ_KEYWORD_HONGBAO){
			List<AccessibilityNodeInfo> infolist  = info.findAccessibilityNodeInfosByText(word);
			if(!infolist.isEmpty()){
				for(AccessibilityNodeInfo node:infolist){
					//这里进行过滤可点击的红包,放到后面去过滤的话感觉非常操蛋
					if(node.getText()==null||
					    //过滤出包含关键字的节点,只取和关键字相同的
					    !node.getText().toString().equals(word)||
						/**
						 * 下面这个条件是过滤已拆开的红包
						 * 如果口令红包的口令设置成"口令红包"
						 * 会让插件陷入死循环,所以必须加个新的判断条件
						 * 不过这样会耗费更多的时间,所以口令尽量不要设置成关键字
						 */
						node.getParent().getChildCount()!=3||
					   !node.getParent().findAccessibilityNodeInfosByText(QQ_KEYWORD_FAILD_CLICK).isEmpty())
					continue;
					list.add(node);
				}
			}
		}
		if(list.size()==0) {
			runState=false;
			return ;
		}
		Log.i(TAG,"数量>>>" list.size() "  获取红包耗时:" (System.currentTimeMillis()-time) "ms");
		clickAction(list);
	}
	
	private void clickAction(List<AccessibilityNodeInfo> infolist){
		for(AccessibilityNodeInfo node :infolist){
			String text=node.getText().toString();
			AccessibilityNodeInfo info=getClickableNode(node);
			if(info==null) continue;
			Log.i(TAG,"模拟点击>>>" text);
			info.performAction(AccessibilityNodeInfo.ACTION_CLICK);
			if(text.equals(QQ_KEYWORD_HONGBAO[1])){
				onClick();
			}else{
				isNeedBack=true;
			}
		}
		runState=false;
		Log.i(TAG,"总共耗时:" (System.currentTimeMillis()-time) "ms");
	}
	
	/**
	 * 获取一个可以点击的节点
	 */
	private AccessibilityNodeInfo getClickableNode(AccessibilityNodeInfo node){
		AccessibilityNodeInfo parent=node;
		while(parent!=null){
			if(parent.isClickable()){
				break;
			}
			parent=parent.getParent();
		}
		return parent;
	}
	
	private void wakeAndUnlock(boolean b){
		if(b){
			//获取电源管理器对象
			mPowerManager=(PowerManager)getApplicationContext().getSystemService(Context.POWER_SERVICE);
			//获取PowerManager.WakeLock对象,后面的参数|表示同时传入两个值,最后的是调试用的Tag
			mWakeLock = mPowerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "bright");
			//点亮屏幕
			mWakeLock.acquire();
			//得到键盘锁管理器对象
			mKeyguardManager= (KeyguardManager)getSystemService(Context.KEYGUARD_SERVICE);
			mKeyguardLock= mKeyguardManager.newKeyguardLock("unLock");
			//解锁
			mKeyguardLock.disableKeyguard();
		}else{
			//锁屏
			mKeyguardLock.reenableKeyguard();
			//释放wakeLock,关灯
			mWakeLock.release();
		}
		
	}
	
	
	
}



主界面代码:


package com.moyan.hongbao.ui;


import java.net.InetAddress;
import android.app.Activity;
import android.os.Bundle;
import android.content.Intent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import android.widget.TextView;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.webkit.WebChromeClient;

import com.moyan.hongbao.R;

public class MainActivity extends Activity implements OnClickListener {
	TextView txt;
	
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
		//txt=(TextView)findViewById(R.id.txtHelp);
		findViewById(R.id.btnSetting).setOnClickListener(this);
		findViewById(R.id.btnAuthor).setOnClickListener(this);
		findViewById(R.id.btnJoin).setOnClickListener(this);
    }
	
	@Override
	public void onClick(View p1){
		switch(p1.getId()){
			case R.id.btnSetting:
				openSetting();
				break;
			case R.id.btnAuthor:
				contactAuthor("269139812");
				break;
			case R.id.btnJoin:
				joinQQGroup("nwEuPSLNqjGGyj538_vPXhn4MVcX0_kJ");
				break;
		}
	}
	
	
	private void openSetting() {
        try {
            Intent intent = new Intent(android.provider.Settings.ACTION_ACCESSIBILITY_SETTINGS);
            startActivity(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
	
	public boolean joinQQGroup(String key) {
		Intent intent = new Intent();
		intent.setData(android.net.Uri.parse("mqqopensdkapi://bizAgent/qm/qr?url=http%3A%2F%2Fqm.qq.com%2Fcgi-bin%2Fqm%2Fqr%3Ffrom%3Dapp%26p%3Dandroid%26k%3D"   key));
		try {
			startActivity(intent);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	public void contactAuthor(String u){
		WebView webView = new WebView(this);
		webView.getSettings().setJavaScriptEnabled(true);
		webView.loadUrl("http://wpa.qq.com/msgrd?v=1&uin=" u "&site=qq&menu=yes");
		webView.setWebChromeClient(new WebChromeClient(){});
	}
	
}