标签:ice except else sdn tag pac arch targe 下一步
1、在非微信消息列表界面,收到通知消息的事件,推断通知栏里的文本是否有[微信红包]的keyword,有则能够推断为用户收到红包的消息(当然,你能够有益发一条包含这个keyword的文本消息去整蛊你的朋友)。然后,我们就自己主动化触发这个消息的意图事件(Intent);
2、在通知栏跳进微信界面后,是去到com.tencent.mm.ui.LauncherUI这个Activity界面。我们知道,红包的消息上,包含了keyword领取红包或者View的id。那我们就依据这个keyword找到对应的View,然后再触发ACTION_CLICK(点击事件);
3、在点击红包后。会跳到com.tencent.mm.plugin.luckymoney.ui.LuckyMoneyReceiveUI这个拆红包的Activity,当然老方法,找keyword拆红包或id,然后触发自己主动化点击事件。
这样就能够完毕整个自己主动化完毕抢红包的流程了,所以核心就是找keyword。然后模拟用户点击事件,就这么简单。下面具体说一下代码的实现。
下面是通过DDMS工具里的Dump
View Hierarchy For UI Automator 去分析微信UI结构。
关键代码
package com.example.hook;
import java.util.List;
import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.AccessibilityServiceInfo;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.os.Build;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
@SuppressLint("NewApi")
public class HookService extends AccessibilityService {
private final String TAG = "HookService";
/**
* 当通知栏改变或界面改变时会触发该方法
*/
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
if (event == null)
return;
if (event.getEventType() == 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("[微信红包]")) {//获取通知栏字符,若包括 [微信红包] 则模拟手指点击事件
handleNotificationChange(event);
break;
}
}
}
}
/**
* 以下内容能够借助 Dump View Hierarchy For UI Automator 去分析微信UI结构
*/
if (event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
System.out.println("TYPE_WINDOW_STATE_CHANGED --> "+event.getClassName());
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();
}
}
}
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("[微信红包]");
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);
try { //依据 Dump View Hierarchy For UI Automator 能够知道得到的控件的.getParent().getParent().getParent().getParent()
//才是要点击的根布局。 调用performAction(AccessibilityNodeInfo.ACTION_CLICK)触发点击事件
parent.getParent().getParent().getParent().performAction(AccessibilityNodeInfo.ACTION_CLICK);
System.out.println("click------");
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
break;
}
}
}
}
public void handleNotificationChange(AccessibilityEvent event) {
if (event == null)
return;
if (event.getEventType() != AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
return;
}
if (event.getParcelableData() instanceof Notification) {
Notification notification = (Notification) event
.getParcelableData();
if (!(event.getParcelableData() instanceof Notification)) {
return;
}
notification = (Notification) event.getParcelableData();
PendingIntent pendingIntent = notification.contentIntent;
try {
pendingIntent.send(); //点击通知栏消息
System.out.println("send....");
} catch (PendingIntent.CanceledException e) {
e.printStackTrace();
}
}
}
@Override
public void onInterrupt() {
// TODO Auto-generated method stub
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
return super.onStartCommand(intent, START_STICKY, startId);
}
}
project下载链接 http://pan.baidu.com/s/1kTu4qAr
标签:ice except else sdn tag pac arch targe 下一步
原文地址:http://www.cnblogs.com/tlnshuju/p/6888991.html