如何通过 onKeyEvent 在辅助功能服务上禁用按键操作?
How can I disable the action of pressed key by onKeyEvent on accessibility service?
我正在开发一个 android 应用程序,它修改按下的键的操作(VOLUME_UP,VOLUME_DOWN,KEYENTER)
我有一个自拍杆控制器,它有三个按钮。我可以检测到按下了哪个按钮,并且可以做一些我想做的事情 而无需禁用按键的原始按键事件
我需要禁用按下按钮的原始按键事件。
我的服务标签在 Android 清单中是这样的:
<service android:name=".CustomListener"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="@string/accessibility_service_label">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
</service>
我的 accesibility_service_config 是这样的:
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagRequestFilterKeyEvents"
android:canRequestFilterKeyEvents="true"
android:canRetrieveWindowContent="true"
android:notificationTimeout="50"
android:packageNames="com.custom333.clevent"
我的 onKeyevent 函数是:
@Override
protected boolean onKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
KeyEvent.KEYCODE_META_RIGHT
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
Log.d("##CURRENTKEY", "Volume -");
case KeyEvent.KEYCODE_VOLUME_UP:
Log.d("##CURRENTKEY", "Volume +");
return false;
}
return super.onKeyEvent(event);
}
使用这段代码,我可以获得按下的键,但我无法禁用原始键事件。
有没有人可以帮我解决这个问题?
这个还是不行
但我找到了适合我的解决方案。
例如;
如果按键事件是提高音量,我可以使用 AudioManager 保持相同的音量级别。这是在处理音量上调原始按键事件的拒绝。
之后我可以做我想做的事了。
尝试 return "true" 而不是 "return super.onKeyEvent(event);"
正如文档所说, onKeyEvent 是一个过滤器并接收事件的副本。因此,如果我们要消费该事件 - 我们应该 return "true" 和 "false" 如果只有 "observing".
我正在开发一个 android 应用程序,它修改按下的键的操作(VOLUME_UP,VOLUME_DOWN,KEYENTER)
我有一个自拍杆控制器,它有三个按钮。我可以检测到按下了哪个按钮,并且可以做一些我想做的事情 而无需禁用按键的原始按键事件
我需要禁用按下按钮的原始按键事件。
我的服务标签在 Android 清单中是这样的:
<service android:name=".CustomListener"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE"
android:label="@string/accessibility_service_label">
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/accessibility_service_config" />
</service>
我的 accesibility_service_config 是这样的:
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFeedbackType="feedbackAllMask"
android:accessibilityFlags="flagRequestFilterKeyEvents"
android:canRequestFilterKeyEvents="true"
android:canRetrieveWindowContent="true"
android:notificationTimeout="50"
android:packageNames="com.custom333.clevent"
我的 onKeyevent 函数是:
@Override
protected boolean onKeyEvent(KeyEvent event) {
int keyCode = event.getKeyCode();
KeyEvent.KEYCODE_META_RIGHT
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
Log.d("##CURRENTKEY", "Volume -");
case KeyEvent.KEYCODE_VOLUME_UP:
Log.d("##CURRENTKEY", "Volume +");
return false;
}
return super.onKeyEvent(event);
}
使用这段代码,我可以获得按下的键,但我无法禁用原始键事件。
有没有人可以帮我解决这个问题?
这个还是不行
但我找到了适合我的解决方案。
例如;
如果按键事件是提高音量,我可以使用 AudioManager 保持相同的音量级别。这是在处理音量上调原始按键事件的拒绝。
之后我可以做我想做的事了。
尝试 return "true" 而不是 "return super.onKeyEvent(event);" 正如文档所说, onKeyEvent 是一个过滤器并接收事件的副本。因此,如果我们要消费该事件 - 我们应该 return "true" 和 "false" 如果只有 "observing".