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

Android 通过电视遥控器长按D Pad中央按钮,android,amazon,Android,Amazon,我正在使用Amazon Fire Stick TV开发电视应用程序。我需要通过电视遥控器处理Dpad中心按钮的长按事件。 对于Dpad中心按钮,只有当我长按Dpad中心按钮时,才会多次收到对onKeyDown()的调用 在尝试长按DPad中心按钮时,我没有收到对活动的OnKeyUp()方法和onLongKeyPress()方法的任何调用。这是虫子吗 编译SDK版本为“23”Isha Dhawan 我发现了一个处理长按键事件的小技巧: 我做了以下几件事。我创建了一个长值来存储上次事件的停机时间。此

我正在使用Amazon Fire Stick TV开发电视应用程序。我需要通过电视遥控器处理Dpad中心按钮的长按事件。 对于Dpad中心按钮,只有当我长按Dpad中心按钮时,才会多次收到对
onKeyDown()
的调用

在尝试长按DPad中心按钮时,我没有收到对活动的
OnKeyUp()
方法和
onLongKeyPress()
方法的任何调用。这是虫子吗

编译SDK版本为“23”

Isha Dhawan 我发现了一个处理长按键事件的小技巧:

我做了以下几件事。我创建了一个长值来存储上次事件的停机时间。此外,我还创建了一个delta成员,用于确定何时应触发LongPress事件:

private long mLastKeyDownTime = 0;
private long mPressedDelta = 1000;
按下中间按钮时,我会检查自媒体开始发送longpress事件以来是否经过了足够的时间:

@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(int-keyCode,KeyEvent事件){
布尔值=假;
开关(钥匙代码){
case KeyEvent.KEYCODE\媒体\快进:
打破
case KeyEvent.KEYCODE\u媒体\u倒带:
打破
case KeyEvent.KEYCODE\媒体\播放\暂停:
打破
case KeyEvent.KEYCODE\u DPAD\u中心:
已处理=正确;
长时间=SystemClock.uptimeMillis();

如果(mLastKeyDownTime+mppressedDelta我通过在
dispatchKeyEvent(keyevent事件)
中处理
KEYCODE\u DPAD\u CENTER
keyevent来解决它,如下所示:

@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);
    }
}

我目前遇到了同样的问题。亚马逊似乎没有为遥控器提供longpress功能。文档中说使用OnKey或OnKeyDown来处理输入。我成功地处理了快进和快退按钮的长按事件,但没有处理Dpad中心按钮。对于Dpad中心按钮,onKeyUp和o长按时不会调用nLongKeyPress方法。由于onKeyDown()被多次/反复调用,此解决方案将导致在事件KEYCODE\u DPAD\u CENTER上长按时多次调用onCenter()。我只需要在长按DPAD\u CENTER按钮时单次调用onCenter()。问题是没有(我知道)从FireTV遥控器获得正确LongPress呼叫的方法。因此需要一个包含计时器的解决方案。