【问题标题】:Android Accessibility Service: Open Accessibility MenuAndroid 无障碍服务:打开无障碍菜单
【发布时间】: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);
       }
   });
}

SOURCE

但是,如果我尝试在无障碍服务上使用组合手势来打开菜单,则什么也没有发生:

尝试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


    【解决方案1】:

    我在一个开源项目中发现了这个,它在 Kotlin 中,是一个功能性函数:

    /**
     * Perform the provided click on the current activity.
     *
     * @param click the click to be performed.
     */
    private fun performClick(click: ClickInfo) {
        val clickPath = Path()
        val clickBuilder = GestureDescription.Builder()
    
        clickPath.moveTo(click.from!!.x.toFloat(), click.from!!.y.toFloat())
        when (click.type) {
            ClickInfo.SINGLE -> {
                clickBuilder.addStroke(StrokeDescription(clickPath, 0, 1))
            }
            ClickInfo.SWIPE -> {
                clickPath.lineTo(click.to!!.x.toFloat(), click.to!!.y.toFloat())
                clickBuilder.addStroke(StrokeDescription(clickPath, 0, 175))
            }
        }
    
        dispatchGesture(clickBuilder.build(), null, null)
    }
    

    这是原始来源: https://github.com/Nain57/Smart-AutoClicker

    问候

    【讨论】:

    • 感谢您的尝试回答,但此(或修改此)不会产生正确的结果。我使用与此代码完全相同的机制在 AccessibilityService 中创建手势。它也记录在我的问题中(尝试1)。这是一个多行滑动的问题。 Google 似乎已经承认这是 TalkBack 的一个错误:issuetracker.google.com/u/2/issues/185631661
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    相关资源
    最近更新 更多