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

598 阅读2分钟

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

为用户执行操作

从 Android 4.0(API 级别 14)开始,无障碍服务可以代表用户执行操作,包括更改输入焦点和选择(激活)界面元素。在 Android 4.1(API 级别 16)中,操作的范围已经过扩展,包括了滚动列表以及与文字字段互动。无障碍服务还可以执行全局操作,如转到主屏幕、按“返回”按钮,以及打开通知屏幕和最近用过的应用列表。Android 4.1 还包含一种新的焦点类型,即“无障碍服务焦点”,它使所有可见元素都能由无障碍服务选择。

这些新功能使无障碍服务的开发者能够创建替代导航模式(如手势导航),并使残障用户能够更好地控制他们的 Android 设备。

监听手势

无障碍服务可以监听特定手势,并通过代表用户执行操作进行响应。此功能是在 Android 4.1(API 级别 16)中添加的,它要求无障碍服务请求激活“触摸浏览”功能。服务请求激活该功能的方法是将其 AccessibilityServiceInfo 实例的flags 成员设为 FLAG_REQUEST_TOUCH_EXPLORATION_MODE,如以下示例所示:

public class MyAccessibilityService extends AccessibilityService {
    @Override
    public void onCreate() {
        getServiceInfo().flags = AccessibilityServiceInfo.FLAG_REQUEST_TOUCH_EXPLORATION_MODE;
    }
    ...
}

服务请求激活“触摸浏览”之后,用户必须允许开启该功能(如果尚未激活)。激活此功能后,服务可通过其 onGesture() 回调方法接收无障碍手势的通知,并且可以通过为用户执行操作进行响应。 连续手势

搭载 Android 8.0(API 级别 26)的设备包含对连续手势或包含多个 Path 对象的程序化手势的支持。

指定连续轻触时,您必须使用 GestureDescription.StrokeDescription 构造函数中的最后一个参数 willContinue 指定它们属于同一个程序化手势,如以下代码段所示:

// Simulates an L-shaped drag path: 200 pixels right, then 200 pixels down.
private void doRightThenDownDrag() {
    Path dragRightPath = new Path();
    dragRightPath.moveTo(200, 200);
    dragRightPath.lineTo(400, 200);
    long dragRightDuration = 500L; // 0.5 second

    // The starting point of the second path must match
    // the ending point of the first path.
    Path dragDownPath = new Path();
    dragDownPath.moveTo(400, 200);
    dragDownPath.lineTo(400, 400);
    long dragDownDuration = 500L;
    GestureDescription.StrokeDescription rightThenDownDrag =
            new GestureDescription.StrokeDescription(dragRightPath, 0L,
            dragRightDuration, true);
    rightThenDownDrag.continueStroke(dragDownPath, dragRightDuration,
            dragDownDuration, false);
}