对原始问题的回答“检测软件”主页“按钮何时被按下?
根据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"
/>
最后一个是很酷的。它允许您设置一个活动,该活动将通过辅助功能服务配置屏幕右上角的“设置”按钮打开。
据我所知,我不能指望softbutton实现的关键事件,我正在寻找一个解决方案来阻止我的accesibility服务,导致它显示一个用户界面相关的表情符号在屏幕上,他们没有主机应用程序没有意义 – surya
然后,你应该以“以功能为中心”的方式提出您的问题。响应主页按钮可以回答许多不同的功能要求。答案不应该猜测你正在回答这个机制的功能要求。解释你想要的行为,而不是你破碎的解决方案。如果你的要求是“听家按钮被按下”,你不能。这是我在帖子中看到的唯一具体问题。如果你说“我试图用这个机制去做......”,那么也许我可以帮忙。 – ChrisCM
这就是说,我建议在另一篇文章中这样做。您提出的具体问题是“我可以听主按钮被按下吗”已被回答,并且您无法获得有用的信息。你应该打开一个新的问题,说“我希望我的无障碍服务行为像这样......这怎么会发生?”这两个问题是分开的,并且是独一无二的。 – ChrisCM