2017-03-31 109 views
1

创建“AccessibilityService”,并且能够根据输入的文本显示提示。问题是我想在Host应用程序主页按下时停止活动服务。 我曾尝试添加在softKey“HOME”按钮上停止Android辅助功能UI组件按下

<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相同时

回答

2

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

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

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

+0

据我所知,我不能指望softbutton实现的关键事件,我正在寻找一个解决方案来阻止我的accesibility服务,导致它显示一个用户界面相关的表情符号在屏幕上,他们没有主机应用程序没有意义 – surya

+0

然后,你应该以“以功能为中心”的方式提出您的问题。响应主页按钮可以回答许多不同的功能要求。答案不应该猜测你正在回答这个机制的功能要求。解释你想要的行为,而不是你破碎的解决方案。如果你的要求是“听家按钮被按下”,你不能。这是我在帖子中看到的唯一具体问题。如果你说“我试图用这个机制去做......”,那么也许我可以帮忙。 – ChrisCM

+0

这就是说,我建议在另一篇文章中这样做。您提出的具体问题是“我可以听主按钮被按下吗”已被回答,并且您无法获得有用的信息。你应该打开一个新的问题,说“我希望我的无障碍服务行为像这样......这怎么会发生?”这两个问题是分开的,并且是独一无二的。 – ChrisCM

0

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

我能够获得HOME Events.even,但花了四天的时间找出一条出路。 Chris真的帮助我朝正确的方向思考。

+1

警告:您还需要依靠脆弱的实施。这起作用的原因是因为“ACTION_CLOSE_SYSTEM_DIALOGS”是碰巧被触发的意图。这是一个公共API。但是,系统主页按钮不需要使用此方法关闭系统对话框。所以任何不启动的发射器都会完全破坏这个方法。我的方法更可靠,因为它对每个系统都起作用是最不可能的。如果它不起作用,你会错过一个包名称。如果这不适用于某个特定系统,那么你就已经存在了。 – ChrisCM

+0

是的..这可能只适用于股票二进制设备,但我尝试的方法应该工作不工作,所以现在我可能必须坚持这个解决方案 – surya