Android AccessibilityService 使用詳解

轉轉請註明出處: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及以上.




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章