1. <div id="f8mbs"></div>
        您好,歡迎來到源碼搜藏網!分享精神,快樂你我!
        [加入VIP] 設為首頁 | 收藏本站 | 網站地圖 | Sitemap | TAG標簽
      2. 首 頁
      3. 在線工具
      4. jquery手冊
      5. 當前位置:首頁 > 安卓源碼 > 技術博客 >

        Android 輔助功能服務AccessibilityService使用

        時間:2019-02-13 17:16 來源:互聯網 作者:源碼搜藏 瀏覽:收藏 挑錯 推薦 打印

        Android提供輔助功能服務的目的在于幫助那些具有視覺、身體或年齡相關限制的用戶更輕松的使用Android設備和應用,例如當用戶懸停在屏幕的重要區域上時將文本轉換為語音或觸覺反饋,從而使一些有視力缺陷的用戶也能夠使用。除此之外,我們還可以使用Accessibi

        Android提供輔助功能服務的目的在于幫助那些具有視覺、身體或年齡相關限制的用戶更輕松的使用Android設備和應用,例如當用戶懸停在屏幕的重要區域上時將文本轉換為語音或觸覺反饋,從而使一些有視力缺陷的用戶也能夠使用。除此之外,我們還可以使用AccessibilityService將一些人工操作進行自動化處理,從而將人從這些無聊繁瑣的重復操作中解放出來。

        1、首先需要定義一個繼承自AccessibilityService的服務(這里命名為MyAccessibilityService),并在AndroidManifest中聲明:

        <service
            android:name=".MyAccessibilityService"
            android:description="@string/accessibility_service_description"
            android:label="@string/accessibility_service_label"
            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/accessibility_service_config"/>
        </service>

        其中accessibility_service_description是有關這個服務的功能說明,accessibility_service_label是服務的名稱,這些會在設置里面的輔助服務中顯示出來,用戶需要在里面開啟服務才能使用。permissionintent-filter是固定寫法。meta-data主要用于對服務進行一些配置,配置的具體內容在 res/xml/accessibility_service_config.xml 文件里面:

        <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
            android:description="@string/accessibility_service_description"
            android:packageNames="com.example.android.apis"
            android:accessibilityEventTypes="typeAllMask"
            android:accessibilityFlags="flagDefault"
            android:accessibilityFeedbackType="feedbackSpoken"
            android:notificationTimeout="100"
            android:canRetrieveWindowContent="true"
            android:settingsActivity="com.example.android.accessibility.ServiceSettingsActivity"/>

        服務的配置選項具體可參考 https://developer.android.com/reference/android/accessibilityservice/AccessibilityServiceInfo.html 這里僅解釋一下幾個比較重要的配置屬性:
        android:packageNames服務要監控的應用的包名,如果有多個則用逗號連起來,空著表示監聽所有的應用。
        android:accessibilityEventTypes服務要監控的事件類型,如通知、窗口改變、點擊、焦點改變等等,如果有多個可以用 | 連起來,typeAllMask代表所有類型。
        android:accessibilityFeedbackType服務反饋的方式,如語音、震動等等,feedbackAllMask代表所有類型。
        android:notificationTimeout 接受事件的時間間隔(毫秒)
        android:canRetrieveWindowContent 服務能否獲取窗口里面的內容
        這些配置除了在xml里面寫之外,還可以在代碼中建立一個AccessibilityServiceInfo對象,然后通過setServiceInfo()來設置。

        2、輔助服務繼承AccessibilityService類并覆蓋該類中的以下方法:
        onServiceConnected 系統成功連接到輔助功能服務時調用,可以執行執行任何一次性設置步驟,包括連接到用戶反饋系統服務,如音頻管理器或設備振動器。還可以在此調用setServiceInfo()設置服務配置。
        onAccessibilityEvent 當系統檢測到與Accessibility服務指定的事件過濾參數匹配的AccessibilityEvent時調用。這是必須實現的方法,通常需要在該方法中根據AccessibilityEvent作出判斷并執行一些處理。
        onInterrupt 當系統想要中斷服務提供的反饋時調用,通常是響應用戶操作,如將焦點移動到其他控件。
        onUnbindonDestroy 當系統即將關閉輔助功能服務時調用,可以執行任何一次性關機程序,包括取消分配用戶反饋系統服務,例如音頻管理器或設備振動器。

        3、AccessibilityEvent 是輔助功能服務中一個非常重要的類,它主要用于提供有關用戶界面交互的信息。當用戶界面中發生了服務需要關注的事件時系統就會發送AccessibilityEvent事件,并傳遞到onAccessibilityEvent方法。通常,用得比較多的是event.getEventType()event.getClassName(),分別用于獲取當前事件的類型和發生該事件的類名,通過這兩個的判斷可以過濾想要處理的事件,并進行操作。例如,當點擊一個按鈕時,會發送一個type為TYPE_VIEW_CLICKED,className為android.widget.Button的事件,如果我們需要在某個按鈕被點擊時做一些操作,就可以在onAccessibilityEvent中對event進行判斷。
        AccessibilityEvent 的Type包括:

        TYPE_VIEW_CLICKED
        TYPE_VIEW_LONG_CLICKED
        TYPE_VIEW_FOCUSED
        TYPE_VIEW_SELECTED
        TYPE_VIEW_TEXT_CHANGED
        TYPE_WINDOW_STATE_CHANGED
        TYPE_NOTIFICATION_STATE_CHANGED
        TYPE_TOUCH_EXPLORATION_GESTURE_START
        TYPE_TOUCH_EXPLORATION_GESTURE_END
        TYPE_VIEW_HOVER_ENTER
        TYPE_VIEW_HOVER_EXIT
        TYPE_VIEW_SCROLLED
        TYPE_VIEW_TEXT_SELECTION_CHANGED
        TYPE_WINDOW_CONTENT_CHANGED
        TYPE_ANNOUNCEMENT
        TYPE_GESTURE_DETECTION_START
        TYPE_GESTURE_DETECTION_END
        TYPE_TOUCH_INTERACTION_START
        TYPE_TOUCH_INTERACTION_END
        TYPE_VIEW_ACCESSIBILITY_FOCUSED
        TYPE_WINDOWS_CHANGED
        TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED

        4、AccessibilityNodeInfo 同樣是輔助功能服務中一個非常重要的類,它代表了一個View的狀態信息。我們可以通過event.getSource()獲取發生事件的控件的信息,也可以通過getRootInActiveWindow()獲取當前窗口中的根節點的信息。前提是服務配置中android:canRetrieveWindowContenttrue,并且發生事件的窗口為當前窗口,否則這兩個方法返回的值都為null
        那么,我們得到了AccessibilityNodeInfo能做什么呢?AccessibilityNodeInfo和View一樣,也是一個具有層級關系的節點樹,一個AccessibilityNodeInfo里面可以有多個AccessibilityNodeInfo的子節點,當我們想要獲取一個目標節點時,可以先獲取根節點,然后再通過遞歸遍歷其子節點去尋找,也可以通過findAccessibilityNodeInfosByViewId()findAccessibilityNodeInfosByText()方法去尋找。當找到目標節點后,可以對其執行想要的操作,比如點擊,滾動,填入文字等等。
        舉個例子,當我們想要在當前界面點擊第一個文字為“確定”的按鈕時:

        AccessibilityNodeInfo rootNode = getRootInActiveWindow();
        if (rootNode != null) {
            List<AccessibilityNodeInfo> nodes = rootNode.findAccessibilityNodeInfosByText("確定");
            for (AccessibilityNodeInfo node : nodes) {
                if (TextUtils.equals(node.getText(), "確定") &amp;&amp; TextUtils.equals(node.getClassName(), "android.widget.Button")) {
                    node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
                }
            }
        }

        首先調用getRootInActiveWindow()獲取當前界面的根節點,然后再通過findAccessibilityNodeInfosByText()找到所有包含目標文字的節點(注意,這里是包含目標文字,而非完全與目標文字相同),之后再遍歷這個列表,找到第一個Text完全等于目標文字,且控件類型為Button的節點,最后再調用performAction(AccessibilityNodeInfo.ACTION_CLICK)執行點擊事件。
        AccessibilityNodeInfo 中的Action包括:

        ACTION_ACCESSIBILITY_FOCUS
        ACTION_ARGUMENT_COLUMN_INT
        ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN
        ACTION_ARGUMENT_HTML_ELEMENT_STRING
        ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT
        ACTION_ARGUMENT_PROGRESS_VALUE
        ACTION_ARGUMENT_ROW_INT
        ACTION_ARGUMENT_SELECTION_END_INT
        ACTION_ARGUMENT_SELECTION_START_INT
        ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE
        ACTION_CLEAR_ACCESSIBILITY_FOCUS
        ACTION_CLEAR_FOCUS
        ACTION_CLEAR_SELECTION
        ACTION_CLICK
        ACTION_COLLAPSE
        ACTION_COPY
        ACTION_CUT
        ACTION_DISMISS
        ACTION_EXPAND
        ACTION_FOCUS
        ACTION_LONG_CLICK
        ACTION_NEXT_AT_MOVEMENT_GRANULARITY
        ACTION_NEXT_HTML_ELEMENT
        ACTION_PASTE
        ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY
        ACTION_PREVIOUS_HTML_ELEMENT
        ACTION_SCROLL_BACKWARD
        ACTION_SCROLL_FORWARD
        ACTION_SELECT
        ACTION_SET_SELECTION
        ACTION_SET_TEXT
        FOCUS_ACCESSIBILITY
        FOCUS_INPUT
        MOVEMENT_GRANULARITY_CHARACTER
        MOVEMENT_GRANULARITY_LINE
        MOVEMENT_GRANULARITY_PAGE
        MOVEMENT_GRANULARITY_PARAGRAPH
        MOVEMENT_GRANULARITY_WORD

        其中用的比較多的有點擊、長按、滾動等等,如果想為EditText設置文字可以用:

        Bundle arguments = new Bundle();
        arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
        inputNode.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);

        另外,AccessibilityService中還有一個performGlobalAction()方法,用于執行一些通用的事件,主要包括:

        GLOBAL_ACTION_BACK    點擊返回按鈕
        GLOBAL_ACTION_HOME    點擊home
        GLOBAL_ACTION_NOTIFICATIONS    打開通知
        GLOBAL_ACTION_RECENTS    打開最近應用
        GLOBAL_ACTION_QUICK_SETTINGS    打開快速設置
        GLOBAL_ACTION_POWER_DIALOG    打開長按電源鍵的彈框
        Android 輔助功能服務AccessibilityService使用轉載http://www.rhcg.tw/appboke/39527.html
        標簽:網站源碼
        辽宁十一选五单双