停止 Android 辅助功能 UI 软键上的组件 "HOME" 按下按钮
stopping Android Accessibility UI Component on softKey "HOME" Button pressed
已创建 "AccessibilityService" 并且能够显示基于文本的提示 Entered.The 问题是我想在主机应用程序主页按下时停止 activity 服务。
我试过添加
<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" 事件时停止辅助功能服务。
原始问题的答案:"Detecting when the software 'Home' button is pressed?"
根据 Android 文档,软键盘不需要发送硬件键盘事件,事实上 Android 示例不需要,所以应用商店中的几乎所有软件键盘都不需要.您只能依赖来自外部蓝牙和硬件键盘的事件。
简单地说,你不能可靠地做你想做的事,API 不支持它。
问题编辑答案:
让我重申一下,没有 "RELIABLE" 方法可以做到这一点。
您可以做的是侦听与屏幕更改相关的事件,并检测屏幕内容何时与主屏幕匹配。现在,这仍然是一个非常脆弱的解决方案。与任何其他 Activity 相比,没有一致的方法来检测启动器 Activity,也没有办法确定您设置的匹配器是否可能匹配非启动器 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,它将通过辅助服务配置屏幕右上角的 "Settings" 按钮打开。
最后,我不得不使用以下代码收听 HomeWatch Listener。
https://gist.github.com/nfeld9807/0ab8341133c58c71f874
虽然我花了四天时间才找到出路,但我还是找到了家 Events.even。
克里斯真的帮助我思考了正确的方向。
在此代码中,您可以检查返回点击。
它对我有用:
if (event.packageName == "com.android.systemui") {
if (event.contentDescription.trim() == "Home") {
// do something
}
}
已创建 "AccessibilityService" 并且能够显示基于文本的提示 Entered.The 问题是我想在主机应用程序主页按下时停止 activity 服务。 我试过添加
<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" 事件时停止辅助功能服务。
原始问题的答案:"Detecting when the software 'Home' button is pressed?"
根据 Android 文档,软键盘不需要发送硬件键盘事件,事实上 Android 示例不需要,所以应用商店中的几乎所有软件键盘都不需要.您只能依赖来自外部蓝牙和硬件键盘的事件。
简单地说,你不能可靠地做你想做的事,API 不支持它。
问题编辑答案:
让我重申一下,没有 "RELIABLE" 方法可以做到这一点。
您可以做的是侦听与屏幕更改相关的事件,并检测屏幕内容何时与主屏幕匹配。现在,这仍然是一个非常脆弱的解决方案。与任何其他 Activity 相比,没有一致的方法来检测启动器 Activity,也没有办法确定您设置的匹配器是否可能匹配非启动器 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,它将通过辅助服务配置屏幕右上角的 "Settings" 按钮打开。
最后,我不得不使用以下代码收听 HomeWatch Listener。 https://gist.github.com/nfeld9807/0ab8341133c58c71f874
虽然我花了四天时间才找到出路,但我还是找到了家 Events.even。 克里斯真的帮助我思考了正确的方向。
在此代码中,您可以检查返回点击。 它对我有用:
if (event.packageName == "com.android.systemui") {
if (event.contentDescription.trim() == "Home") {
// do something
}
}