AccessibilityService是Android官方給出的一個無障礙輔助的API,可以實現(xiàn)一系列Android自動化行為立润,諸如自動化測試狂窑、自動搶紅包、自動安裝應用桑腮、清理系統(tǒng)運存泉哈、劫持瀏覽器、等等破讨。
AccessibilityService快速集成
繼承系統(tǒng)AccessibilityService
AccessibilityService是抽象類丛晦,要實現(xiàn)它的抽象方法。
public class MyAccessibilityService extends AccessibilityService {
private static final String TAG = "MyAccessibilityService";
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
//此處寫事件的處理提陶,常用eventType和className來做判斷烫沙。
int eventType = event.getEventType();
String className = event.getClassName().toString();
Log.d(TAG, "當前事件類型:" + eventType);
Log.d(TAG, "當前執(zhí)行類名:" + className);
//根據(jù)不同的eventType和className,來進行具體的事件處理
}
@Override
public void onInterrupt() {
}
}
寫配置文件
有兩種方式隙笆,一種是在資源文件夾下新建xml文件夾锌蓄,然后新建一個xml格式的文件來寫配置。
<?xml version="1.0" encoding="UTF-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowStateChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:notificationTimeout="100"
android:description="@string/accessibility_description"
android:packageNames="com.tencent.mm,com.android.systemui" />
accessibilityEventTypes:要監(jiān)聽的事件類型撑柔。
accessibilityFeedbackType:反饋方式瘸爽,有語音播出和振動。
description:開啟服務處處看到的描述信息铅忿。
packageNames:要監(jiān)控的應用的包名剪决,多應用包名用英文逗號隔開。
配置文件的其他屬性含義參考:
http://blog.csdn.net/zhou452840622/article/details/51734677
另一種方式是復寫AccessibilityService中的onServiceConnected方法檀训,在里面設置參數(shù)信息柑潦。參數(shù)含義與xml形式的配置的屬性一一對應。
該方法可以在運行期間動態(tài)修改服務配置肢扯。
注意:動態(tài)配置方法只能用來配置動態(tài)屬性:eventTypes妒茬,feedbackType,flags蔚晨,notificaionTimeout及packageNames。
@Override
protected void onServiceConnected() {
// 如果僅僅在此處配置,就new一個AccessibilityServiceInfo铭腕;
AccessibilityServiceInfo serviceInfo = new AccessibilityServiceInfo();
// 如果需要與xml配置方式混用银择,就用getServiceInfo
// AccessibilityServiceInfo serviceInfo = getServiceInfo();
serviceInfo.eventTypes = AccessibilityEvent.TYPES_ALL_MASK;
serviceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC;
serviceInfo.packageNames = new String[] { "com.tencent.mm","com.android.systemui" };
serviceInfo.notificationTimeout = 100;//單位:毫秒
//設置配置
setServiceInfo(serviceInfo);
super.onServiceConnected();
}
注冊服務
與一般服務注冊方式基本一致,如果是使用xml來寫的配置累舷,則在AndroidManifest.xml中注冊的同時浩考,用meta-data標簽配置。
注意:
1被盈、meta-data標簽只對4.0以上系統(tǒng)可用析孽,如需兼容4.0以下,可以用代碼動態(tài)的來配置只怎。
2袜瞬、不能在一個service里同時寫兩個或多個這樣的配置文件,一次只能寫一個meta-data標簽身堡,比較復雜的業(yè)務邏輯可以用動態(tài)配置的方式來控制邓尤。
<service
android:name="com.sk.androidauto.service.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/accessibility_systemui" />
//不能在一個service里同時寫兩個或多個這樣的配置文件,一次只能寫一個meta-data標簽贴谎,比較復雜的業(yè)務邏輯可以用動態(tài)配置的方式來控制
<!-- <meta-data -->
<!-- android:name="android.accessibilityservice" -->
<!-- android:resource="@xml/accessibility_wx" /> -->
</service>
手動啟用服務
安裝完實現(xiàn)了AccessibilityService的應用后汞扎,需要到系統(tǒng)的“設置--其他高級設置--輔助功能”里找到該應用,“開啟服務”擅这。
不需要在代碼里start或bind澈魄。
至此,AccessibilityService已經(jīng)集成完成仲翎,可以根據(jù)自己的業(yè)務邏輯來寫代碼了痹扇。
使用AccessibilityService來自動模擬操作的常用操作和注意點參考我的另一篇文章:
Android自動化之AccessibilityService模擬操作(經(jīng)驗總結)
另外,AccessibilityService使用起來受限很大谭确,不能做到諸如隨意點擊屏幕任意一點等操作帘营,許多情況下,可能還需要結合adb命令來共同實現(xiàn)某些操作逐哈,使用adb命令來自動模擬操作請參考:
Android自動化之a(chǎn)db模擬操作(可實現(xiàn)按鍵精靈和手機輸入法)