無障礙(一)功能實現(xiàn)

一、簡介

無障礙服務(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
獲取到的內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容