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