通过电视遥控器长按 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);
}
}
我正在使用 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);
}
}