我希望能够在AccessibilityService中知道用户何时按下任何系统键,特别是后退键。我已经覆盖了onKeyEvent方法,但是它根本没有响应,但是我从onAccessibilityEvent获得了所有事件。
@Override
public boolean onKeyEvent(KeyEvent event) {
Log.e(TAG, "------------------- onKeyEvent ----------------------------");
return super.onKeyEvent(event);
}
以下是我的配置文件,我正在监视AccessibilityService软件包(一个子项目)和实际的应用程序软件包。
包含AccessibilityService的子项目的Manifest.xml。
<?xml version="1.0" encoding="utf-8"?>
...
<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文件如下:
<?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为“开”。
添加
android:canRequestFilterKeyEvents="true"
android:canRequestTouchExplorationMode="true"
到上面的accessibility.xml中,并且以编程方式添加了onServiceConnected中的等效项。
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;
}
没有积极的结果
最佳答案
我怀疑您正在尝试从没有发送它们的软键盘拦截这些事件。仅从硬件键盘可靠地发送按键事件。实际上,不建议从软件输入法服务手动发送事件,并且在OS的早期版本中可能导致潜在的恶意影响。从Android KeyEvent文档中:
由于软输入法可以使用多种创造性的文本输入方式,因此不能保证软键盘上的任何按键都会产生按键事件:这由IME自行决定,实际上不建议发送此类事件。对于软输入法上的任何键,您都不应依赖于接收KeyEvent。特别是,默认软件键盘将永远不会向任何以Jelly Bean或更高版本为目标的应用程序发送任何按键事件,而只会将某些按Delete键和返回键的事件发送给以Ice Cream Sandwich或更早版本为目标的应用程序。请注意,其他软件输入方法可能永远不会发送键事件,无论版本如何。如果您需要与软件键盘进行特定的交互,请考虑使用诸如IME_ACTION_DONE之类的编辑器操作,因为它可以使用户更清楚地了解您的应用程序对按键的反应。
便宜的蓝牙键盘是您最好的选择。或具有正确配置的仿真器。
编辑:
或者,您的配置文件中可能有错误。在您的accessibilityservice.xml中,替换以下行:
android:accessibilityFlags="flagIncludeNotImportantViews"
有了这个:
android:accessibilityFlags="flagIncludeNotImportantViews|flagRequestFilterKeyEvents"
您还可以在可访问性服务代码中实现相同的目的。
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);
}