如何跟踪 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);
}

UPDATEonKeyEvent 方法仅从同一事件接收单个 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 硬件键长按事件。