輔助功能服務是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的情況下實現靜默安裝的功能(不是真正的靜默安裝)和現在很多人都知道的搶紅包功能。如果你想利用此方法獲取一些個人隱私,我勸你還是打消這個念頭吧,因爲不可能,哈哈。