Android 如何在没有可访问性权限的情况下检测输入法选择器的可见性

Android 如何在没有可访问性权限的情况下检测输入法选择器的可见性,android,android-activity,service,dialog,android-input-method,Android,Android Activity,Service,Dialog,Android Input Method,我向用户显示输入法选择器,如下图所示,选择器弹出: InputMethodManager im = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE); im.showInputMethodPicker(); 现在,如果用户解除选取器(例如,通过在选取器外部单击),我想知道,发生了什么,并执行一些操作(例如,显示通知) 我知道在一个活动中,我可以用肮脏的方式检查根布局的焦点,我知道有了可访问性

我向用户显示输入法选择器,如下图所示,选择器弹出:

InputMethodManager im = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);

im.showInputMethodPicker();
现在,如果用户解除选取器(例如,通过在选取器外部单击),我想知道,发生了什么,并执行一些操作(例如,显示通知)

我知道在一个活动中,我可以用肮脏的方式检查根布局的焦点,我知道有了可访问性权限,我可以检查系统对话框是否聚焦

问题是我正在运行一项服务,即使我不在我的应用程序中,我也需要检测输入法选择器是否显示(例如,第三方应用程序,甚至Android键盘设置)而且,我发现用户对可访问性权限有点困惑,因此我不想求助于此,而是想找到另一种方法


还有别的办法吗?

这应该是一个评论,但我还不能评论

您可以使用
xposed
来实现这一点,但这需要一个根设备,我想这不需要讨论

这是可访问性api的主要目的。您已经说过不想使用肮脏的方式,所以我建议您只使用上述api


出于安全方面的考虑,不应该有这样做的方法(而且也不是很好)

我当然希望这在使用可访问性API之外是不可能的。应用程序不应该以其他方式监视前台用户界面。@另一方面,我们可以很容易地找出哪个应用程序正在前台运行。正因为如此,我认为可能有一种方法。“另一方面,尽管我们可以相当容易地确定哪个应用程序正在前台运行”——在5.0+上不那么容易,我正在与谷歌合作,以弥补这些隐私和安全缺陷中的另一个。@commonware fair。