先介绍下AccessibilityService。
结构
public abstract class AccessibilityService extends Service
java.lang.Object
android.content.Context
android.content.ContextWrapper
android.app.Service
android.accessibilityservice.AccessibilityService
类概述
当AccessibilityEvent事件被启动后AccessibilityService 会接收回调函数运行于后台,这些事件指的是在用户接口间的状态转换,比如,焦点变化,按钮被点击等。
一些辅助服务继承于此类并且实现它的抽象方法,像这样的一个服务和其他服务一样在AndroidManifest.xml中被声明但它必须被指定操纵“android.accessibilityservice.
AccessibilityService”的意图,
那么再来说下微信抢红包的主要思路。
MyAccessibilityService的实现代码
package com.cvte.weixinhb;
import android.accessibilityservice.AccessibilityService;
import android.app.Notification;
import android.app.PendingIntent;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;
import java.util.List;
/**
* Created by cvtpc on 2015/3/29.
*/
public class MyAccessibilityService extends AccessibilityService {
private static final String WEIXINHONGBAO = "[微信红包]";
private static final String GETWEIXINHONGBAO = "领取红包";
private static final String OPENHONGBAO = "拆红包";
private static final String WEIXINLINK = "[链接]";
private static final String WEIXINDIDI = "滴滴";
private Boolean isHongBao = true;
private Boolean isNeedfindParent = false;
private static final String TAG = "MyAccessibilityService";
@Override
protected void onServiceConnected() {
super.onServiceConnected();
Toast.makeText(this, "连接服务成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
final int eventType = accessibilityEvent.getEventType();
LogUtil.d(TAG,"--->"+accessibilityEvent);
//这里是首先检测通知栏的变化
if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
List<CharSequence> textList = accessibilityEvent.getText();
if (!textList.isEmpty()) {
for (CharSequence t : textList) {
String str = t.toString();
if (str.contains(WEIXINHONGBAO)) {
isHongBao = true;
openWeiXin(accessibilityEvent);
}else if(str.contains(WEIXINDIDI)&&str.contains(WEIXINLINK)){
isHongBao = false;
openWeiXin(accessibilityEvent);
}
}
}
}else if(eventType==AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){
openLink(accessibilityEvent);
}
}
/**
* 检测到有微信红包/滴滴的字样,打开微信
* @param event
*/
private void openWeiXin(AccessibilityEvent event) {
if (event.getParcelableData() == null || !(event.getParcelableData() instanceof Notification)) {
return;
}
Notification notification = (Notification) event.getParcelableData();
PendingIntent contentIntent = notification.contentIntent;
try {
contentIntent.send();
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
/**
* 当检测到窗口的变化时,打开相应的连接
*/
private void openLink(AccessibilityEvent event){
if("com.tencent.mm.ui.LauncherUI".equals(event.getClassName())){
isNeedfindParent = true;
if(isHongBao){
clickHB(isNeedfindParent,GETWEIXINHONGBAO);
}else{
clickHB(isNeedfindParent,WEIXINDIDI);
}
}else if("com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI".equals(event.getClassName())){
isNeedfindParent = false;
clickHB(isNeedfindParent,OPENHONGBAO);
}
}
/**
* 点击领取红包
*/
private void clickHB(boolean isNeedfindParent,String keyWord){
AccessibilityNodeInfo nodeInfo = getRootInActiveWindow();
if(nodeInfo!=null){
List<AccessibilityNodeInfo> nodeInfoList = nodeInfo.findAccessibilityNodeInfosByText(keyWord);
if(!nodeInfoList.isEmpty()){
//获取最新的红包
AccessibilityNodeInfo node = null;
if(isHongBao){
node= nodeInfoList.get(nodeInfoList.size()-1);
}else{
if(nodeInfoList.size()>2){
node = nodeInfoList.get(nodeInfoList.size()-2);
}
}
if(isNeedfindParent){
if(node!=null){
AccessibilityNodeInfo parentNode = node.getParent();
if(parentNode!=null){
LogUtil.d(TAG,"---->"+parentNode);
parentNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}else{
LogUtil.d(TAG,"node is null");
}
}else{
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
}
}
@Override
public void onInterrupt() {
}
}
Manifest配置
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cvte.weixinhb" >
<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:name=".MyAccessibilityService"
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/accessibilityservice" />
</service>
</application>
</manifest>
accessibilityservice内容
<?xml version="1.0" encoding="UTF-8"?>
<accessibility-service
android:canRetrieveWindowContent="true"
android:accessibilityFlags=""
android:notificationTimeout="100"
android:accessibilityFeedbackType="feedbackGeneric"
android:packageNames="com.tencent.mm"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged"
android:description="@string/accessibility_description"
xmlns:android="http://schemas.android.com/apk/res/android"/>