初識AccessibilityService

AccessibilityService作爲安卓中無障礙輔助服務,所謂無障礙就是不需要用戶手動操作,自動完成一些列事件。給我印象最深刻的就是魅族手機出來的時候,自帶微信搶紅包功能,當時是真的讓我羨慕了一把。這尼瑪,每次紅包最先搶,而且當時還總是認爲先搶的紅包大,那個羨慕嫉妒恨啊。

今天有一個同事,想做一個微信自動發廣告的(微商一般都想這樣),需求是這樣的:在軟件中提前設置好要發送的內容,通過微信,定時發送到朋友圈。聽到這個需求,我第一個想起的就是微信自動搶紅包,於是搜了一下,網上的資料還不是很多,不過供學習的使用還是可以。參考了http://www.jianshu.com/p/4cd8c109cdfb(涅槃1992)的簡述文章,自己也總結一下使用的心得。

使用步驟

1、創建自己的服務類,繼承AccessabilityService,會實現兩個抽象方法:onAccessibilityEvent(AccessibilityEvent event)onInterruput()

我們要做的主要工作在onAccessibilityEvent(AccessibilityEvent event)這個方法中,後面在詳細說明

2、在AndroidManifest.xml中聲明該服務。

<service
    android:name=".AutoSendServiece"
    android:enabled="true"
    android:exported="true"
    android:label="@string/app_name"
    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/auto_reply_service_config" />
</service>


permission 和 標籤必須要有,而且不能少。
resource中的配置文件如下(auto_reply_service_config)

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" 
android:accessibilityEventTypes="typeNotificationStateChanged|typeWindowStateChanged" 
android:accessibilityFeedbackType="feedbackGeneric" 
android:accessibilityFlags="flagDefault" 
android:canRetrieveWindowContent="true" 
android:description="@string/accessibility_service_description" 
android:notificationTimeout="100" android:packageNames="com.tencent.mm" />
字段說明:
packageNames是來過濾監聽具體包的事件,如果沒有,則是所有的程序包。我這裏是微信的
accessibilityEventTypes表示監聽那種事件類型,窗口變化,通知等等,如果是所有的則用typeAllMask
具體的參考api文檔。
下面對onAccessibilityEvent事件說明一下,代碼如下
public void onAccessibilityEvent(AccessibilityEvent event) { 
    int eventType = event.getEventType();
    switch (eventType) { 
         case AccessibilityEvent.TYPE_NOTIFICATION_STATE_CHANGED: break; 
         case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: break;
      }
  }

可以在api文檔中查閱AccessibilityEvent相關說明,還有很多事件類型,一般用的較多的可能就是通知,以及界面變化(也就是以上兩個事件類型,具體的做具體分析)
其次用的比較多的是AccessibilityNodeInfo這個信息,可以通過getRootInActiveWindow()獲取,官方解釋爲:
Gets the root node in the currently active window if this service can retrieve window content.(大致意思是獲取當前可見窗口界面根節點信息,當然前提是服務能檢索到窗口內容)
通過AccessibilityNodeInfo我們可以做很多事了,大部分的操作也是通過這個類來的。

這兩個方法也是使用過程中用的最多的,通過id或者文字查找到指定控件,然後就可以執行我們想要的點擊、長按等一系列操作。比如

查找資源id或者名字可以通過android studio的設備查看器查看。

查看
標題

選中你的設備,點擊圖示的按鈕,就可以抓取到屏幕元素。

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