如何跟踪 AccessibilityService 中的长按按键事件?
How to track long press key events in AccessibilityService?
我想在我的 AccessibilityService 中收听 KeyEvents。 ACTION_DOWN
事件在 AccessibilityService
class.
的 onKeyEvent
方法中成功触发
但它没有收到 onKeyLongPress 事件,即使调用 startTracking()
事件。看这段代码:
@Override
protected boolean onKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (isVolumeKey(event.getKeyCode())) {
event.startTracking();
Log.d(LOG_TAG, "Started tracking!");
return true;
}
} else if (event.isLongPress()) {
// This code is not executing
Log.d(LOG_TAG, "Received a long press event");
return true;
}
return super.onKeyEvent(event);
}
UPDATE:onKeyEvent
方法仅从同一事件接收单个 ACTION_DOWN
而不是多个。但是,Activity
也是可能的。
无障碍服务中没有检测长按事件的特定侦听器。
但是,您可以使用带有 postDelayed() 方法的 Handler 来实现此目的。
您可以在 KeyEvent.ACTION_DOWN 中初始化并启动处理程序,如下所示。
if (mLongPressHandler == null) {
mLongPressHandler = new Handler();
}
mLongPressHandler.postDelayed(new Runnable() {
public void run() {
//Your code
mLongPressHandler.postDelayed(this, DELAY_VOLUME_LONG_PRESS);
}
}, DELAY_VOLUME_LONG_PRESS);
并且您可以在 KeyEvent.ACTION_UP 中删除 CallbacksAndMessages() 以从处理程序中删除回调。
mLongPressHandler.removeCallbacksAndMessages(null);
我这样做是为了检测音量 up/down 硬件键长按事件。
我想在我的 AccessibilityService 中收听 KeyEvents。 ACTION_DOWN
事件在 AccessibilityService
class.
onKeyEvent
方法中成功触发
但它没有收到 onKeyLongPress 事件,即使调用 startTracking()
事件。看这段代码:
@Override
protected boolean onKeyEvent(KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (isVolumeKey(event.getKeyCode())) {
event.startTracking();
Log.d(LOG_TAG, "Started tracking!");
return true;
}
} else if (event.isLongPress()) {
// This code is not executing
Log.d(LOG_TAG, "Received a long press event");
return true;
}
return super.onKeyEvent(event);
}
UPDATE:onKeyEvent
方法仅从同一事件接收单个 ACTION_DOWN
而不是多个。但是,Activity
也是可能的。
无障碍服务中没有检测长按事件的特定侦听器。 但是,您可以使用带有 postDelayed() 方法的 Handler 来实现此目的。 您可以在 KeyEvent.ACTION_DOWN 中初始化并启动处理程序,如下所示。
if (mLongPressHandler == null) {
mLongPressHandler = new Handler();
}
mLongPressHandler.postDelayed(new Runnable() {
public void run() {
//Your code
mLongPressHandler.postDelayed(this, DELAY_VOLUME_LONG_PRESS);
}
}, DELAY_VOLUME_LONG_PRESS);
并且您可以在 KeyEvent.ACTION_UP 中删除 CallbacksAndMessages() 以从处理程序中删除回调。
mLongPressHandler.removeCallbacksAndMessages(null);
我这样做是为了检测音量 up/down 硬件键长按事件。