实例介绍
【实例简介】借助AccessibilityService实现模拟操作
【实例截图】
【实例截图】

【核心代码】
package com.miscell.lucky;
import android.accessibilityservice.AccessibilityService;
import android.app.KeyguardManager;
import android.app.Notification;
import android.app.PendingIntent;
import android.content.Context;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.PowerManager;
import android.text.TextUtils;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.RemoteViews;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* Created by chenjishi on 15/2/12.
*/
public class MonitorService extends AccessibilityService {
private ArrayList<AccessibilityNodeInfo> mNodeInfoList = new ArrayList<AccessibilityNodeInfo>();
private boolean mLuckyClicked;
private boolean mContainsLucky;
private boolean mContainsOpenLucky;
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
final int eventType = event.getEventType();
if (eventType == AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED) {
unlockScreen();
mLuckyClicked = false;
/**
* for API >= 18, we use NotificationListenerService to detect the notifications
* below API_18 we use AccessibilityService to detect
*/
if (Build.VERSION.SDK_INT < 18) {
Notification notification = (Notification) event.getParcelableData();
List<String> textList = getText(notification);
if (null != textList && textList.size() > 0) {
for (String text : textList) {
if (!TextUtils.isEmpty(text) && text.contains("[微信红包]")) {
final PendingIntent pendingIntent = notification.contentIntent;
try {
pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
}
break;
}
}
}
}
}
if (eventType == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
AccessibilityNodeInfo nodeInfo = event.getSource();
if (null != nodeInfo) {
mNodeInfoList.clear();
traverseNode(nodeInfo);
if (mContainsLucky && !mLuckyClicked) {
int size = mNodeInfoList.size();
if (size > 0) {
/** step1: get the last hongbao cell to fire click action */
AccessibilityNodeInfo cellNode = mNodeInfoList.get(size - 1);
cellNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
mContainsLucky = false;
mLuckyClicked = true;
}
}
if (mContainsOpenLucky) {
int size = mNodeInfoList.size();
if (size > 0) {
/** step2: when hongbao clicked we need to open it, so fire click action */
AccessibilityNodeInfo cellNode = mNodeInfoList.get(size - 1);
cellNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
mContainsOpenLucky = false;
}
}
}
}
}
private void unlockScreen() {
KeyguardManager keyguardManager = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE);
final KeyguardManager.KeyguardLock keyguardLock = keyguardManager.newKeyguardLock("MyKeyguardLock");
keyguardLock.disableKeyguard();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK
| PowerManager.ACQUIRE_CAUSES_WAKEUP
| PowerManager.ON_AFTER_RELEASE, "MyWakeLock");
wakeLock.acquire();
}
private void traverseNode(AccessibilityNodeInfo node) {
if (null == node) return;
final int count = node.getChildCount();
if (count > 0) {
for (int i = 0; i < count; i ) {
AccessibilityNodeInfo childNode = node.getChild(i);
traverseNode(childNode);
}
} else {
CharSequence text = node.getText();
if (null != text && text.length() > 0) {
String str = text.toString();
if (str.contains("领取红包")) {
mContainsLucky = true;
AccessibilityNodeInfo cellNode = node.getParent().getParent().getParent();
if (null != cellNode) mNodeInfoList.add(cellNode);
}
if (str.contains("拆红包")) {
mContainsOpenLucky = true;
mNodeInfoList.add(node);
}
}
}
}
public List<String> getText(Notification notification) {
if (null == notification) return null;
RemoteViews views = notification.bigContentView;
if (views == null) views = notification.contentView;
if (views == null) return null;
// Use reflection to examine the m_actions member of the given RemoteViews object.
// It's not pretty, but it works.
List<String> text = new ArrayList<String>();
try {
Field field = views.getClass().getDeclaredField("mActions");
field.setAccessible(true);
@SuppressWarnings("unchecked")
ArrayList<Parcelable> actions = (ArrayList<Parcelable>) field.get(views);
// Find the setText() and setTime() reflection actions
for (Parcelable p : actions) {
Parcel parcel = Parcel.obtain();
p.writeToParcel(parcel, 0);
parcel.setDataPosition(0);
// The tag tells which type of action it is (2 is ReflectionAction, from the source)
int tag = parcel.readInt();
if (tag != 2) continue;
// View ID
parcel.readInt();
String methodName = parcel.readString();
if (null == methodName) {
continue;
} else if (methodName.equals("setText")) {
// Parameter type (10 = Character Sequence)
parcel.readInt();
// Store the actual string
String t = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(parcel).toString().trim();
text.add(t);
}
parcel.recycle();
}
} catch (Exception e) {
}
return text;
}
@Override
public void onInterrupt() {
}
}
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)
支持(0) 盖楼(回复)