首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何确定是否在AccessibilityService中按下了回键,onKeyDown没有响应?

如何确定是否在AccessibilityService中按下了回键,onKeyDown没有响应?
EN

Stack Overflow用户
提问于 2016-02-06 05:05:10
回答 1查看 2.5K关注 0票数 3

我希望能够在AccessibilityService中知道用户何时按下任何系统键,特别是后退键。我已经重写了onKeyEvent方法,但是它根本没有响应,但是我从onAccessibilityEvent获得了所有的事件。

代码语言:javascript
运行
复制
@Override
public boolean onKeyEvent(KeyEvent event) {
    Log.e(TAG, "------------------- onKeyEvent ----------------------------");
    return super.onKeyEvent(event);
}

下面是我的配置文件,我正在监视AccessibilityService包(一个子项目)和实际的应用程序包。

Manifest.xml用于包含AccessibilityService的子项目。

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>

..。

代码语言:javascript
运行
复制
<service android:name="com.foo.MyAccessibilityService"
    android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE">
  <intent-filter>
    <action android:name="android.accessibilityservice.AccessibilityService" />
  </intent-filter>
  <meta-data android:name="android.accessibilityservice"
      android:resource="@xml/accessibilityservice" />
</service>

accessibilityservice.xml文件如下:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>

<accessibility-service
xmlns:tools="http://schemas.android.com/tools"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagIncludeNotImportantViews"
xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/emachine_accessibility_service_description"
android:settingsActivity="com.foo.services.MyAccessibilityService"
tools:ignore="UnusedAttribute"
android:canRetrieveWindowContent="true"
android:canRequestFilterKeyEvents="true"
android:canRequestTouchExplorationMode="true"/>

是的,系统可访问性设置下的com.foo.services.MyAccessibilityService是“On”。

已添加

代码语言:javascript
运行
复制
    android:canRequestFilterKeyEvents="true"
android:canRequestTouchExplorationMode="true"

在上面的accessibility.xml中,以编程方式添加了onServiceConnected中的等价物。

代码语言:javascript
运行
复制
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        info.flags |= AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS;
        info.flags |= AccessibilityServiceInfo.CAPABILITY_CAN_REQUEST_FILTER_KEY_EVENTS;
        info.flags |= AccessibilityServiceInfo.CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT;
    }

没有积极的结果

EN

回答 1

Stack Overflow用户

发布于 2016-02-07 01:51:38

我怀疑您正试图从没有发送这些事件的软键盘上拦截这些事件。关键事件只能可靠地从硬件键盘发送。实际上,不鼓励从软件输入方法服务手动发送事件,并且在操作系统的早期版本中会导致潜在的恶意影响。来自Android KeyEvent文档:

由于软输入方法可以使用多种和创造性的输入文本的方法,因此不能保证软键盘上的任何按键都会产生一个键事件:这由IME自行决定,而且实际上不鼓励发送此类事件。对于软输入方法上的任何键,您都不应该依赖于接收KeyEvents。特别是,默认的软件键盘将永远不会将任何键事件发送到任何应用程序earlier或更高版本,并且只会将事件发送给某些按下delete键和返回键的应用程序,以获取冰激凌三明治或更早版本。请注意,不管版本如何,其他软件输入方法可能永远不会发送关键事件。如果您需要与软件键盘进行特定的交互,请考虑使用像IME_ACTION_DONE这样的编辑器操作,因为它可以让用户更清楚地了解应用程序对按键的反应。

便宜的蓝牙键盘是你最好的选择。或具有正确配置的仿真器。

编辑:

或者,您可能在配置文件中出现错误。在您的accessibilityservice.xml中,替换以下一行:

代码语言:javascript
运行
复制
android:accessibilityFlags="flagIncludeNotImportantViews"

在这方面:

代码语言:javascript
运行
复制
android:accessibilityFlags="flagIncludeNotImportantViews|flagRequestFilterKeyEvents"

您还可以在可访问性服务代码中获得相同的信息。

代码语言:javascript
运行
复制
protected void onServiceConnected() {
    super.onServiceConnected();

    AccessibilityServiceInfo tempInfo = getServiceInfo();
    tempInfo.flags |= AccessibilityServiceInfo.FLAG_INCLUDE_NOT_IMPORTANT_VIEWS;
    tempInfo.flags |= AccessibilityServiceInfo.FLAG_REQUEST_FILTER_KEY_EVENTS;
    setServiceInfo(tempInfo);

}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35237550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档