轉轉請註明出處:http://blog.csdn.net/u011510784/article/details/50716869
利用Android輔助工具類AccessibilityService可以獲取手機當前頁面的信息,用戶的操作事件等等.
首先新建一個類繼承AccessibilityService:
<span style="font-family:Times New Roman;font-size:14px;">public class MyAccessibilityService extends AccessibilityService {
private final String TAG = "MyAccessibilityService";
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
int eventType = event.getEventType();
String eventTypeName = "";
switch (eventType) {
case AccessibilityEvent.TYPE_VIEW_CLICKED:
eventTypeName = "TYPE_VIEW_CLICKED";
break;
case AccessibilityEvent.TYPE_VIEW_FOCUSED:
eventTypeName = "TYPE_VIEW_FOCUSED";
break;
case AccessibilityEvent.TYPE_VIEW_LONG_CLICKED:
eventTypeName = "TYPE_VIEW_LONG_CLICKED";
break;
case AccessibilityEvent.TYPE_VIEW_SELECTED:
eventTypeName = "TYPE_VIEW_SELECTED";
break;
case AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED:
eventTypeName = "TYPE_VIEW_TEXT_CHANGED";
break;
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
eventTypeName = "TYPE_WINDOW_STATE_CHANGED";
break;
case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED:
eventTypeName = "TYPE_NOTIFICATION_STATE_CHANGED";
break;
case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_END:
eventTypeName = "TYPE_TOUCH_EXPLORATION_GESTURE_END";
break;
case AccessibilityEvent.TYPE_ANNOUNCEMENT:
eventTypeName = "TYPE_ANNOUNCEMENT";
break;
case AccessibilityEvent.TYPE_TOUCH_EXPLORATION_GESTURE_START:
eventTypeName = "TYPE_TOUCH_EXPLORATION_GESTURE_START";
break;
case AccessibilityEvent.TYPE_VIEW_HOVER_ENTER:
eventTypeName = "TYPE_VIEW_HOVER_ENTER";
break;
case AccessibilityEvent.TYPE_VIEW_HOVER_EXIT:
eventTypeName = "TYPE_VIEW_HOVER_EXIT";
break;
case AccessibilityEvent.TYPE_VIEW_SCROLLED:
eventTypeName = "TYPE_VIEW_SCROLLED";
break;
case AccessibilityEvent.TYPE_VIEW_TEXT_SELECTION_CHANGED:
eventTypeName = "TYPE_VIEW_TEXT_SELECTION_CHANGED";
break;
case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
eventTypeName = "TYPE_WINDOW_CONTENT_CHANGED";
break;
}
Log.i(TAG, "eventType:" + eventType);
Log.i(TAG, "eventTypeName:" + eventTypeName);
}
@Override
public void onInterrupt() {
// TODO Auto-generated method stub
}
}</span>
然後新建一個xml配置文件來配置我們的MyAccessibility類:
accessibilityservice.xml :
<span style="font-family:Times New Roman;font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="@string/app_name"
android:settingsActivity="com.example.xxx.android.accessibility.ServiceSettingsActivity" /></span>
android:accessibilityEventTypes="typeAllMask",相應所有的事件,就是MyAccessibility類中swich中的那些事件.
android:accessibilityFeedbackType="feedbackGeneric",手機用什麼方式將信息反饋給用戶,語音震動等等,這裏默認;
android:canRetrieveWindowContent="true",允許獲取手機頁面中的信息
android:settingsActivity中com.example.xxx是你的應用的包名
然後將這個xml配置文件配置到項目中:
<span style="font-family:Times New Roman;font-size:14px;"> <service
android:name="com.example.xxx.MyAccessibilityService"
android:enabled="true"
android:exported="true"
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></span>
然後在我們手機的設置中的輔助功能裏,打開這個輔助服務就可以了.
利用這個類我們可以獲取當前手機頁面的信息,包括控件ID,控件值;當前類的名稱以及用戶的一些操作和手機狀態的變化. 所以利用這些可以做手機自動安裝軟件,模擬點擊,手機自動滑屏等.
public void onAccessibilityEvent(AccessibilityEvent event){}
通過這個event我們可以得到:
event.getEventType()-當前事件的類型; event.getClassName()-當前類的名稱; event.getSource()-當前頁面中的節點信息,等等. 更詳細信查看官方API
遍歷獲取窗口中所有的節點信息也可以用這個方法:
<span style="font-family:Times New Roman;font-size:14px;">public void getInfo() {
AccessibilityNodeInfo info = getRootInActiveWindow();
if (info != null) {
if (info.getChildCount() == 0) {
Log.i(TAG, "控件名稱:" + info.getClassName());
Log.i(TAG, "控件中的值:" + info.getText());
Log.i(TAG, "控件的ID:" + info.getViewIdResourceName());
Log.i(TAG, "點擊是否出現彈窗:" + info.canOpenPopup());
} else {
for (int i = 0; i < info.getChildCount(); i++) {
if (info.getChild(i) != null) {
recycle(info.getChild(i));
}
}
}
}
}</span>
不過這個方法對當前的SDK版本有一定的要求,需要API level 19及以上.