AccessibilityService
2.2016/8/11
1.自定义一个类继承AccessibilityService,重写onAccessibilityEvent()。监控事件状态。
private static final String TAG = "MyAccessibility";
@SuppressLint("NewApi")
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// TODO Auto-generated method stub
int eventType = event.getEventType();
String eventText = "";
Log.i(TAG, "==============Start====================");
switch (eventType) {
case AccessibilityEvent.TYPE_VIEW_CLICKED:
eventText = "TYPE_VIEW_CLICKED";
break;
case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED:
eventText = "TYPE_VIEW_LONG_CLICKED";
break;
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
eventText = "TYPE_WINDOW_STATE_CHANGED";
break;
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
eventText = "TYPE_NOTIFICATION_STATE_CHANGED";
break;
// case AccessibilityEvent.CONTENT_CHANGE_TYPE_SUBTREE:
// eventText = "CONTENT_CHANGE_TYPE_SUBTREE";
// break;
}
Log.i(TAG, eventText);
Log.i(TAG, "=============END=====================");
if(eventText =="TYPE_NOTIFICATION_STATE_CHANGED"){
performClick("权叔叔");
}
if(eventText == "TYPE_WINDOW_STATE_CHANGED"){
}
}
2.在清单文件注册service信息
<service
android:label="@string/app_name"
android:name=".MyAccessibility"
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/click_config"/>
</service>
3.上面的xml/click_config文件,在res下新建一个XML文件。
android:packageNames:需要监控的包名,可以填多个,用,分开。
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/click_auto"
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged"
android:packageNames="com.tencent.mm"
android:accessibilityFeedbackType="feedbackGeneric"
android:notificationTimeout="100"
android:accessibilityFlags=""
android:canRetrieveWindowContent="true"/>
4.通过文本查找控件节点或资源ID,然后拿到节点执行 targetNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);就可以实现点击了。
//执行点击
private void performClick(String text) {
Log.i("MyService","点击执行");
AccessibilityNodeInfo nodeInfo = this.getRootInActiveWindow();
AccessibilityNodeInfo targetNode = null;
//通过名字获取
//targetNode = findNodeInfosByText(nodeInfo,"广告");
targetNode = findNodeInfosByText(nodeInfo,text);
if (targetNode.isClickable()) {
targetNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
//通过文本查找
public static AccessibilityNodeInfo findNodeInfosByText(AccessibilityNodeInfo nodeInfo, String text) {
List<AccessibilityNodeInfo> list = nodeInfo.findAccessibilityNodeInfosByText(text);
if(list == null || list.isEmpty()) {
return null;
}
return list.get(0);
}