【发布时间】:2021-07-15 08:32:37
【问题描述】:
启用 TalkBack 后,用户(能够)可以向上和向右滑动以打开“辅助功能菜单”:
现在我写了一个Accessibility Service,目标是acting on behalf of the user。据我所知,这种类型的操作在无障碍服务中是允许的:
从 Android 4.0(API 级别 14)开始,无障碍服务可以代表用户执行操作,包括更改输入焦点和选择(激活)用户界面元素。在 Android 4.1(API 级别 16)中,操作范围已扩大到包括滚动列表和与文本字段交互。辅助功能服务还可以采取全局操作,例如导航到主屏幕、按下返回按钮、打开通知屏幕和最近的应用程序列表。 Android 4.1 还包括一种新的焦点类型,即 Accessibilty Focus,它可以让无障碍服务选择所有可见元素。
这些新功能使无障碍服务开发人员能够创建替代导航模式(例如手势导航),并让残障用户更好地控制他们的 Android 设备。
我按照 codelab 给出了代表用户执行手势的以下示例:
private void configureSwipeButton() {
Button swipeButton = (Button) mLayout.findViewById(R.id.swipe);
swipeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Path swipePath = new Path();
swipePath.moveTo(1000, 1000);
swipePath.lineTo(100, 1000);
GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();
gestureBuilder.addStroke(new GestureDescription.StrokeDescription(swipePath, 0, 500));
dispatchGesture(gestureBuilder.build(), null, null);
}
});
}
但是,如果我尝试在无障碍服务上使用组合手势来打开菜单,则什么也没有发生:
尝试1: val upSwipe = Path()
upSwipe.moveTo(1000f, 1000f)
upSwipe.lineTo(100f, 1000f)
val rightSwipe = Path()
rightSwipe.moveTo(100f, 1000f)
rightSwipe.lineTo(400f, 1000f)
val builder = GestureDescription.Builder()
builder.addStroke(StrokeDescription(upSwipe, 0, 500, true))
builder.addStroke(StrokeDescription(rightSwipe, 500, 500, false))
dispatchGesture(builder.build(), null, null)
尝试2:
val upSwipe = Path()
upSwipe.moveTo(1000f, 1000f)
upSwipe.lineTo(100f, 1000f)
val rightSwipe = Path()
rightSwipe.moveTo(100f, 1000f)
rightSwipe.lineTo(400f, 1000f)
val combinedSwipe = GestureDescription.Builder()
combinedSwipe.addStroke(
StrokeDescription(upSwipe, 0, 500, true).apply {
continueStroke(rightSwipe, 500, 500, false)
}
)
dispatchGesture(combinedSwipe.build(), null, null)
尝试 3:
val swipePath = Path()
swipePath.moveTo(1000f, 1000f)
swipePath.lineTo(100f, 1000f)
swipePath.lineTo(400f, 1000f)
val gestureBuilder = GestureDescription.Builder()
gestureBuilder.addStroke(StrokeDescription(swipePath, 0, 500))
dispatchGesture(gestureBuilder.build(), null, null)
这里的真正目标是打开辅助功能菜单,而不一定要执行手势(因为这些手势可以由用户更改)。
【问题讨论】:
标签: android accessibility accessibilityservice