Android 使用服务检测软键盘打开/按键事件

Android 使用服务检测软键盘打开/按键事件,android,service,android-softkeyboard,keyevent,Android,Service,Android Softkeyboard,Keyevent,我读过这里大部分关于检测软键盘或检测键盘事件的帖子。我看到了一些方法,比如测量视图的大小。然而,我的问题是,我想用“服务”来检测软键盘是打开的还是按键事件。是否可以通过服务来检测?或者,是否有可能检测到有人正在输入活动?我正在做一项研究,我需要在手机上记录一些活动,包括检测活动中的输入。谢谢 我找到了一个棘手的方法来“某种程度上”解决这个问题。然而,如果你有这样的能力,这需要你的用户为你做一些事情:)所以很明显,这并不能解决你所有的问题 我的巧妙方法是使用。您可以指定要侦听的事件。与窗口大小相关

我读过这里大部分关于检测软键盘或检测键盘事件的帖子。我看到了一些方法,比如测量视图的大小。然而,我的问题是,我想用“服务”来检测软键盘是打开的还是按键事件。是否可以通过服务来检测?或者,是否有可能检测到有人正在输入活动?我正在做一项研究,我需要在手机上记录一些活动,包括检测活动中的输入。谢谢

我找到了一个棘手的方法来“某种程度上”解决这个问题。然而,如果你有这样的能力,这需要你的用户为你做一些事情:)所以很明显,这并不能解决你所有的问题

我的巧妙方法是使用。您可以指定要侦听的事件。与窗口大小相关的事件之一是类型\窗口\内容\更改(见下文)

公共静态最终整数类型\窗口\内容\更改

Added in API level 14
Represents the event of changing the content of a window and more specifically the sub-tree rooted at the event's source.

Constant Value: 2048 (0x00000800)
只要您的应用程序的可访问性服务已启用,您将收到此事件

要收听此事件,您必须启动自己的AccessibilityService。请参阅以了解如何构建一个。然后可以指定要接收的可访问性事件。您可以在xml文件中指定它们:

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:packageNames="MypackageName"
    android:accessibilityEventTypes="typeWindowStateChanged"
    android:accessibilityFeedbackType="feedbackSpoken"
    android:notificationTimeout="100"
/>
然后,您将在方法onAccessibilityEvent(event)中接收事件。然而,这种方法有两个缺点:

  • 只要窗口状态发生更改,就会触发该事件
  • 用户必须在[设置]->[辅助功能]->[服务]中启用辅助功能服务
    同样,此方法仅适用于某些目的。但它适用于您希望“从服务”而不是从您的活动中检测软键盘的情况

    我认为这是对一个众所周知的问题的第一个很好的回应。感谢您没有在示例代码中使用
    键入\u窗口\u内容\u更改
    ;-)。但是,如果您在服务中遇到此事件,如何确定
    TYPE\u WINDOW\u CONTENT\u CHANGED
    事件是否由键盘引起?不幸的是,
    TYPE\u WINDOW\u CONTENT\u CHANGED
    是由许多其他事件触发的,例如更改活动<当EditText第一次聚焦/触摸时,即为用户打开键盘,会触发代码>类型视图聚焦和/或
    类型视图单击
    。但是,键盘关闭时不会触发任何事件,这使我得出结论,辅助功能服务无法检测键盘是否打开。但是,它可以检测用户何时使用
    TYPE\u VIEW\u TEXT\u CHANGED的
    EventType
    加上
    android.widget.EditText的
    ClassName
    EditText
    键入新字符。感谢您的回复!
    protected void onServiceConnected() {   
        AccessibilityServiceInfo info = new AccessibilityServiceInfo();    
        info.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
    }