一、簡介
無障礙服務(wù): 是一種應(yīng)用,它可以模擬用戶操作。協(xié)助殘障用戶或無法與設(shè)備進(jìn)行全面互動的用戶完成操作。例如,正在開車、照顧孩子或參加喧鬧聚會的用戶可能需要其他或替代的界面反饋方式。
無障礙通常被用在: 搶紅包、一鍵獲取權(quán)限、自動搶單等功能中。
詳情可以了解官網(wǎng)介紹。
二、使用
1、創(chuàng)建自己的Service繼承自AccessibilityService
onAccessibilityEvent:觸發(fā)了需要監(jiān)聽的無障礙事件后回調(diào)
onInterrupt:無障礙服務(wù)斷開后回調(diào)
public class MyAccessibilityService extends AccessibilityService {
@Override
public void onCreate() {
super.onCreate();
Log.v("AAAAA", "MyAccessibilityService onCreate 無障礙服務(wù)已啟動");
}
// 當(dāng)觸發(fā)了需要監(jiān)聽的無障礙事件后回調(diào)
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {
// String pkgName = event.getPackageName().toString();
int eventType = event.getEventType();
AccessibilityNodeInfo nodeInfo = event.getSource();
switch (eventType) {
case AccessibilityEvent.TYPE_VIEW_CLICKED:
break;
case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED:
setttleNodeInfo(nodeInfo);
break;
case AccessibilityEvent.TYPE_VIEW_FOCUSED:
break;
}
nodeInfo.recycle();
}
// 打印所有控件的getText
private void setttleNodeInfo(AccessibilityNodeInfo nodeInfo) {
if (nodeInfo == null) return;
for (int i = 0; i < nodeInfo.getChildCount(); i++) {
AccessibilityNodeInfo child = nodeInfo.getChild(i);
Log.v("AAAAA", "setttleNodeInfo getClassName:" + child.getClassName() + ", getText:" + child.getText());
if (child.getChildCount() != 0) {
setttleNodeInfo(child);
}
}
}
// 無障礙服務(wù)斷開后回調(diào)
@Override
public void onInterrupt() {
}
}
2、在AndroidManifest.xml文件中配置Service
(1)為了被視為無障礙服務(wù),需要在清單的application元素中添加一個service。
(2)在service中,還需要添加一個無障礙服務(wù)intent過濾器。
(3)為了與Android 4.1以上版本兼容,還需要添加android.accessibilityservice.AccessibilityService權(quán)限以確保只有系統(tǒng)可以綁定到它。
(4)Android 4.0開始,可以在清單中添加一個引用配置文件的<meta-data>元素,對無障礙服務(wù)進(jìn)行配置。
<!-- 注冊輔助功能服務(wù)-->
<!-- label:無障礙服務(wù)的名稱-->
<service
android:name=".MyAccessibilityService"
android:exported="true"
android:label="我的測試"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<!--通過xml文件完成輔助功能相關(guān)配置,也可以在onServiceConnected中動態(tài)配置-->
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/access_config" />
</service>
3、創(chuàng)建配置文件xml/accessibility_config.xml
在res目錄下新建xml文件夾,并在xml中新建accessibility_config.xml配置文件。
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagDefault"
android:canRetrieveWindowContent="true"
android:description="@string/app_accessibility_description"
android:notificationTimeout="100"
android:packageNames="com.niiiico.demo" />
上述配置的屬性,可以在AccessibilityServiceInfo對象中看到,在對象屬性中有相關(guān)注釋標(biāo)識取值范圍,詳情可直接查看AccessibilityServiceInfo。
| 屬性 | 對象屬性 | 功能 |
|---|---|---|
| accessibilityEventTypes | public int eventTypes; | 無障礙可以接收的事件,typeAllMask表示接收所有事件,多個值用 "|" 隔開 |
| accessibilityFeedbackType | public int feedbackType; | 多個值用 "|" 隔開 |
| accessibilityFlags | public int flags; | 多個值用 "|" 隔開 |
| canRetrieveWindowContent | private int mCapabilities; | 此服務(wù)是否可以讀取窗口中的內(nèi)容 |
| description | private int mDescriptionResId; | 描述此服務(wù)的信息,會顯示在系統(tǒng)開啟服務(wù)的設(shè)置界面 |
| notificationTimeout | public long notificationTimeout; | 發(fā)送2次事件的時間間隔,超過后事件作廢 |
| packageNames | public String[] packageNames; | 被監(jiān)聽的應(yīng)用的包名,多個用","分割 |
| settingsActivity | private String mSettingsActivityName; | 系統(tǒng)啟動服務(wù)界面會出現(xiàn)一個設(shè)置按鈕,用來打開這個Activity |
4、啟動檢查和跳轉(zhuǎn)設(shè)置
(1)啟動檢查
public boolean isAccessibilityEnabled() {
String localServiceStr = new ComponentName(getPackageName(), MyAccessibilityService.class.getName()).flattenToShortString();
AccessibilityManager accessibilityManager = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
List<AccessibilityServiceInfo> accessibilityservices = accessibilityManager.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_GENERIC);
for (AccessibilityServiceInfo info : accessibilityservices) {
if (localServiceStr.equals(info.getId())) {
return true;
}
}
return false;
}
(2)跳轉(zhuǎn)設(shè)置
public void gotoSetting() {
Intent intent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
三、測試
無障礙服務(wù)不需要手動啟動,通過跳轉(zhuǎn)到系統(tǒng)開啟無障礙界面,系統(tǒng)設(shè)置界面打開后,無障礙服務(wù)就會被啟動。
![]() 無障礙列表.jpg
|
![]() 無障礙詳情.jpg
|
|---|


