【问题标题】:stopping Android Accessibility UI Component on softKey "HOME" Button pressed在按下软键“HOME”按钮时停止 Android 辅助功能 UI 组件
【发布时间】:2017-03-31 14:23:41
【问题描述】:

创建了“AccessibilityService”并能够根据输入的文本显示提示。问题是我想在主机应用程序主页按下时停止活动服务。 我已经尝试添加

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
                  android:accessibilityEventTypes="typeAllMask|typeViewClicked|typeViewFocused"
                      android:canRequestFilterKeyEvents="true"
                    android:accessibilityFlags="flagRequestFilterKeyEvents"
                     android:description="@string/accessibility_service_description" />

这样可以解决带有“HOME”物理按钮的手机的问题。 如何在 Nexus 5 等软按钮的“HOME”事件时停止辅助功能服务。

【问题讨论】:

    标签: android accessibilityservice


    【解决方案1】:

    回答原始问题:“检测何时按下软件‘主页’按钮?”

    根据 Android 文档,软键盘不需要发送硬件键盘事件,实际上 Android 示例不需要,因此应用商店中的几乎每个软件键盘都不需要。您只能依赖来自外部蓝牙和硬件键盘的事件。

    简单地说,你不能可靠地做你想做的事,API 不支持它。

    回答问题编辑:

    让我重申,没有“可靠”的方法可以做到这一点。

    您可以做的是监听屏幕更改相关事件,并检测屏幕内容何时与主屏幕匹配。现在,这仍然是一个非常脆弱的解决方案。没有一致的方法来检测 Launcher Activity 与任何其他 Activity,也无法确定您设置的匹配器是否可能匹配不是 Launcher Activity 的东西。但是,这是我认为最合理的方法。

    public void onAccessibilityEvent(AccessibilityEvent e) {
    
        switch (e.getEventType()) {
            case AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED:
            case AccessibilityEvent.TYPE_VIEW_SCROLLED:
            case AccessibilityEvent.TYPE_WINDOWS_CHANGED:
            case AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED: {
                if (detectHomeScreen(getRootInActiveWindow()) {
                    //We are now at the "home" screen, do what you want here.
                }    
            }
        }
    }
    //A List of package names you know to be associated with "launcher" activities.  Populate this list in your classes static initialization block.
    private static ArrayList<String> LAUNCHER_PACKAGE_NAMES;
    
    private static boolean detectHomeScreen(AccessibilityNodeInfo rootNodeInfo) {
        return LAUNCHER_PACKAGE_NAMES.contains(rootNodeInfo.getPackageName().toString())
    }
    

    XML 配置

    <?xml version="1.0" encoding="utf-8"?>
    <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
        android:description="@string/accessibility_service_description"
        android:accessibilityEventTypes="typeAllMask"
        android:accessibilityFlags="flagIncludeNotImportantViews|flagReportViewIds"
        android:canRetrieveWindowContent="true"
        android:notificationTimeout="100"
        android:settingsActivity="com.example.SettingsActivity"
        />
    

    最后一个很酷。它允许您设置一个 Activity,该 Activity 将通过 Accessibility Service 配置屏幕右上角的“设置”按钮打开。

    【讨论】:

    • 我知道我不能指望软按钮实现中的关键事件,我正在寻找一种解决方法来停止我的辅助功能服务,因为它在屏幕上显示了一个带有相关表情符号的用户界面,如果没有主机它们就没有意义应用
    • 那么你应该用“以功能为中心的方式”来表达你的问题。响应主页按钮按下可以满足许多不同的功能要求。答案不必推测您使用此机制回答的功能要求。解释你想要的行为,而不是你破碎的解决方案。如果您的要求是“监听主页按钮被按下”,那么您不能。这是我在您的帖子中看到的唯一具体问题。如果你说“我正在尝试使用这种机制来做......”那么也许我可以提供帮助。
    • 话虽如此,我建议在另一篇文章中这样做。您提出的具体问题“我可以听一下要按下的主页按钮吗”已得到解答,并且您不能提供有用的信息。您应该打开一个新问题,说“我希望我的可访问性服务表现得像这样......这怎么会发生?”这两个问题是独立的,并且非常有用。
    • 嗨,克里斯,感谢您的反馈,我已经根据您的反馈编辑了我的问题。希望它清楚地说明了我在寻找什么
    • 啊,我明白了,您将“typeAllMasked”与其他类型混合使用。这是荒谬的。 Android 将忽略它。你所做的基本上是说 1111 & (1000 | 0100)... 不等于 1111,它等于 1100。我将把所有类型都单独屏蔽,然后在 onAccessibilityEvent 方法中过滤。
    【解决方案2】:

    最后我不得不用下面的代码来监听 HomeWatch 监听器。 https://gist.github.com/nfeld9807/0ab8341133c58c71f874

    我能够获得 HOME Events。尽管花了四天时间才找到出路。 克里斯真的帮助我朝着正确的方向思考。

    【讨论】:

    • 警告:您又一次依赖于一个脆弱的实现。这样做的原因是因为“ACTION_CLOSE_SYSTEM_DIALOGS”是一个碰巧被解雇的意图。这是一个公共 API。但是,系统 Home 按钮不需要使用此方法来关闭系统对话。因此,任何不这样做的启动器都会完全破坏这种方法。我的方法更可靠,因为它在每个系统上都有效。如果它不起作用,则您缺少包名称。如果这不适用于特定系统,那你就完蛋了。
    • 是的..这可能只适用于库存二进制设备,但我尝试了应该不起作用的方法,所以现在我可能不得不坚持这个解决方案
    猜你喜欢
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多