Android 探究AccessibilityService的祕密

  輔助功能服務是Android框架的一項功能,旨在爲安裝在Android設備上的應用程序提供替代的導航反饋給用戶。 無障礙服務可以代表應用程序與用戶進行通信,例如當用戶將盤旋在屏幕的重要區域上時,將文本轉換爲語音或觸覺反饋。
  


創建您的輔助功能服務

  輔助服務可以與普通應用捆綁在一起,也可以作爲獨立的Android項目創建。 在這兩種情況下,創建服務的步驟是相同的​​。 在你的項目中,創建一個擴展AccessibilityService的類。
  

/**
 * Created by xiaolong on 2017/6/6.
 */
public class MyAccessibilityService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {

    }

    @Override
    public void onInterrupt() {

    }
}

  像任何其他服務一樣,您也可以在清單文件中聲明它。 記住要指定它處理android.accessibilityservice意圖,以便在應用程序觸發AccessibilityEvent時調用該服務。
  

<service android:name=".MyAccessibilityService">
         <intent-filter>
         <action android:name="android.accessibilityservice.AccessibilityService"/>
         </intent-filter>
</service>

如果您爲此服務創建了一個新項目,並且不打算提供應用程序,則可以從源代碼中刪除啓動器Activity類(通常稱爲MainActivity.java)。 記住還要從清單中刪除相應的活動元素。

配置您的輔助功能服務

  設置輔助功能服務的配置變量會告訴系統您希望運行的方式和時間。 您想要回應哪些事件類型? 服務應該對所有應用程序有效,還是隻有特定的軟件包名稱? 它使用什麼不同的反饋類型?
  我們有兩種方法來設置這些變量。 向後兼容的選項是使用setServiceInfo(android.accessibilityservice.AccessibilityServiceInfo)在代碼中去配置。 爲此,重寫onServiceConnected()方法並在其中配置你的服務。
  

 @Override
 protected void onServiceConnected() {
     super.onServiceConnected();
     //獲取實例
     AccessibilityServiceInfo info = new AccessibilityServiceInfo();
     //設置此服務想要收聽的事件的類型。 其他不會傳遞給這個服務。
     info.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_VIEW_FOCUSED;
     //如果您只希望此服務與特定應用程序一起使用,請設置它們包名稱在這裏。
     //否則,當服務激活時,它將會收聽來自所有應用程序的事件。
     info.packageNames = new String []{"com.ooowin.yixue.accessibilityservicetext"};
     //設置您的服務將提供的反饋類型。
     info.feedbackType = AccessibilityServiceInfo.FEEDBACK_SPOKEN;
     //僅當沒有包特定的服務時才調用默認服務爲生成的AccessibilityEvent類型。
     // 這個服務是應用程序特定,因此標誌不是必需的。 如果這是一個通用服務,值得考慮設置
     //DEFAULT標誌
     //info.flags = AccessibilityServiceInfo.DEFAULT;
       info.notificationTimeout = 100;
       this.setServiceInfo(info);
    }

  第二個方法是使用XML文件配置服務。 某些配置選項(如canRetrieveWindowContent )僅在使用XML配置服務時可用。 以上使用XML定義的相同配置選項將如下所示:
  

<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeViewClicked|typeViewFocused"
    android:packageNames="com.ooowin.yixue.accessibilityservicetext"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"
    android:canRetrieveWindowContent="true"/>

這時候我們需要在清單文件中引用它,方法是在您的服務聲明中添加一個指向XML文件的標籤。

<service android:name=".MyAccessibilityService"
     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>

請求允許BIND_ACCESSIBILITY_SERVICE權限,確保只有系統可以綁定到它。

響應可訪問性事件

  
  現在我們就可以通過AccessibilityEvent.getEventType()來確定事件的類型從而做出一系列操作。
  

        int eventType = accessibilityEvent.getEventType();
        switch(eventType){
            case AccessibilityEvent.TYPE_VIEW_CLICKED:
                Log.d("TAG","獲取點擊事件的響應");
                break;
            case AccessibilityEvent.TYPE_VIEW_FOCUSED:
                Log.d("TAG","獲取焦點的響應");
                break;
        }

結束語

  利用AccessibilityService我們可以在手機非root的情況下實現靜默安裝的功能(不是真正的靜默安裝)和現在很多人都知道的搶紅包功能。如果你想利用此方法獲取一些個人隱私,我勸你還是打消這個念頭吧,因爲不可能,哈哈。

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