无障碍服务-为用户执行操作(二)

472 阅读3分钟

「这是我参与11月更文挑战的第12天,活动详情查看:2021最后一次更文挑战

使用无障碍操作

无障碍服务可以代表用户执行操作,从而简化用户与应用之间的互动并提高互动效率。从 Android 4.0(API 级别 14)开始,无障碍服务便可以执行操作,并且这在 Android 4.1(API 级别 16)中得到了显著改进。

为了代表用户执行操作,无障碍服务必须注册以从几个或很多个应用接收事件,并通过在服务配置文件中将 android:canRetrieveWindowContent 设为 true 来请求查看应用内容的权限。当服务接收到事件后,它便可以使用 getSource() 从事件中检索 AccessibilityNodeInfo 对象。然后,借助 AccessibilityNodeInfo?hl=zh-cn) 对象,服务可以浏览视图层次结构以确定要执行的操作,并使用 performAction() 为用户执行该操作。

public class MyAccessibilityService extends AccessibilityService {
    @Override
    public void onAccessibilityEvent(AccessibilityEvent event) {
        // get the source node of the event
        AccessibilityNodeInfo nodeInfo = event.getSource();
        // Use the event and node information to determine
        // what action to take
        // take action on behalf of the user
        nodeInfo.performAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD);
        // recycle the nodeInfo object
        nodeInfo.recycle();
    }
    ...
}

performAction() 方法可让服务在应用内执行操作。如果服务需要执行全局操作(如转到主屏幕、按“返回”按钮,以及打开通知屏幕和最近用过的应用列表),则使用 performGlobalAction() 方法。

使用焦点类型

Android 4.1(API 级别 16)引入了一种名为“无障碍功能焦点”的新型界面焦点。无障碍服务可以使用此类焦点来选择任何可见的界面元素并对其执行操作。此类焦点与更为人熟知的“输入焦点”不同,后者可决定当用户输入字符、按键盘上的 Enter 键或者按方向键控件的中间按钮时,屏幕上的哪种界面元素接收输入。

无障碍功能焦点完全独立于输入焦点。实际上,可能会出现以下情况:界面中的一个元素具有输入焦点,而另一个元素具有无障碍功能焦点。无障碍功能焦点旨在为无障碍服务提供一种与屏幕上的任何可见元素互动的方法,无论该元素能否从系统的角度聚焦输入。您可以通过测试无障碍手势来查看实际运用中的无障碍功能焦点。

注意:当某个元素能够进行此类聚焦时,使用无障碍功能焦点的无障碍服务负责同步当前的输入焦点。未同步输入焦点与无障碍功能焦点的服务可能会导致在执行某些操作时,希望输入焦点位于特定位置的应用内出现问题。

无障碍服务可以使用 AccessibilityNodeInfo.findFocus() 方法来确定哪个界面元素具有输入焦点或无障碍功能焦点。您还可以使用 focusSearch() 方法搜索可通过输入焦点选择的元素。最后,无障碍服务可以使用 performAction(AccessibilityNodeInfo.ACTION_SET_ACCESSIBILITY_FOCUS) 方法设置无障碍功能焦点。