通过电视遥控器长按 D Pad 中心按钮

Long Press handing of D Pad center button via TV remote control

我正在使用 Amazon Fire Stick TV 开发电视应用程序。我需要通过电视遥控器处理方向键中心按钮的长按事件。 对于方向键中心按钮,如果我长按方向键中心按钮,我只会多次收到 onKeyDown() 的呼叫。

在尝试长按 DPad 中心按钮时,我没有收到对 Activity 的 OnKeyUp() 方法和 onLongKeyPress() 方法的任何调用。这是一个错误吗?

编译SDK版本为'23'

伊莎达万 我发现了一个小技巧来处理长按键事件:

我做了以下事情。我创建了一个 long 值来存储我最后一次事件的停机时间。此外,我创建了一个 delta 成员来确定何时触发 LongPress 事件:

private long mLastKeyDownTime = 0;
private long mPressedDelta = 1000;

当按下中心时,我检查自媒体开始发送长按事件以来是否经过了足够的时间:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    boolean handled = false;
    switch (keyCode) {
        case KeyEvent.KEYCODE_MEDIA_FAST_FORWARD:
            break;

        case KeyEvent.KEYCODE_MEDIA_REWIND:
            break;

        case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE:
            break;

        case KeyEvent.KEYCODE_DPAD_CENTER:
            handled = true;
            long time = SystemClock.uptimeMillis();
            if (mLastKeyDownTime + mPressedDelta <= time) {
                onCenterLongress();
            }
            mLastKeyDownTime = event.getDownTime();
            onCenter();
            break;

        case KeyEvent.KEYCODE_DPAD_LEFT:
            handled = true;
            onLeft();
            break;

        case KeyEvent.KEYCODE_DPAD_RIGHT:
            handled = true;
            onRight();
            break;

        case KeyEvent.KEYCODE_DPAD_UP:
            handled = true;
            onUp();
            break;

        case KeyEvent.KEYCODE_DPAD_DOWN:
            handled = true;
            onDown();
            break;

        case KeyEvent.KEYCODE_BACK:
            handled = true;
            onBack();
            break;

        case KeyEvent.KEYCODE_MENU:
            handled = true;
            if (event.getDownTime() == mLastKeyDownTime) {
                break;
            }
            mLastKeyDownTime = event.getDownTime();
            onMenu();
            break;
    }
    return handled || super.onKeyDown(keyCode, event);
}

我知道这不是最优雅的解决方案,但我认为它会做你想做的事。对 onKeyDown(..) 的多次调用是由亚马逊用于处理远程 KeyInput 的私有 SDK 引起的。

我通过像这样处理 dispatchKeyEvent(KeyEvent event) 中的 KEYCODE_DPAD_CENTER 键事件解决了这个问题:

@Override
public boolean dispatchKeyEvent(KeyEvent event) {

    int action = event.getAction();
    int keyCode = event.getKeyCode();

    switch (keyCode) {
        case KeyEvent.KEYCODE_DPAD_CENTER:
            Log.d(TAG,"Down time is" + event.getDownTime()+"with action:" + event.getAction()+ "with repeat count"+ event.getRepeatCount()+"with long press"+ event.isLongPress());
            if (action == KeyEvent.ACTION_DOWN && event.isLongPress()) {
                Log.d(TAG,"LOng pres Down time is" + event.getDownTime());
                Log.d(TAG, "Inside long press of Dpad center event");
                onCenter();
                return true;
            }

        default:
            return super.dispatchKeyEvent(event);
    }
}