在softKey“HOME”按钮上按下Android辅助功能UI组件

时间:2017-03-31 14:23:42

标签: android accessibilityservice

创建了“AccessibilityService”,并且能够根据输入的文本显示提示。问题是我想在主机应用程序Home Pressed时停止活动服务。 我试过添加

<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”物理按钮的手机的问题。 如何停止辅助功能服务当软按钮的“HOME”事件与Nexus 5一样。

2 个答案:

答案 0 :(得分:3)

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

根据Android文档,软键盘不需要发送硬件键盘事件,事实上Android样本不需要,因此应用程序商店中的每个软件键盘都没有。您只能依赖外部蓝牙和硬件键盘上的事件。

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

回答问题编辑:

让我重申一下,没有“可靠”的方式来做这件事。

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

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"
    />

最后一个很酷。它允许您通过“辅助功能服务”配置屏幕右上角的“设置”按钮设置将打开的活动。

答案 1 :(得分:0)

最后我必须使用以下代码收听HomeWatch Listener。 https://gist.github.com/nfeld9807/0ab8341133c58c71f874

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