如何在Android onMediaButtonEvent中收听“ACTION_DOWN”(按下键)事件,以便测量时间?

我试着获得时间System.currentTimeMillis() ,而不是用户按下媒体按钮。 但是当媒体按钮再次上升时执行回调action == KeyEvent.ACTION_UP

我不想在我的解决方案中使用BroadcastReceiver。

这是我的代码:

  MediaSession audioSession = new MediaSession(getApplicationContext(), "TAG"); audioSession.setCallback(new MediaSession.Callback() { @Override public boolean onMediaButtonEvent(final Intent mediaButtonIntent) { String intentAction = mediaButtonIntent.getAction(); if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { KeyEvent event = (KeyEvent)mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (event != null) { int action = event.getAction(); if (action == KeyEvent.ACTION_DOWN) { long stopTimeOfGame_millis = System.currentTimeMillis(); UtilsRG.info("time stopped: " +stopTimeOfGame_millis); } if (action == KeyEvent.ACTION_UP) { long test = System.currentTimeMillis(); UtilsRG.info("time stopped up: " +test); } } } return super.onMediaButtonEvent(mediaButtonIntent); } }); PlaybackState state = new PlaybackState.Builder() .setActions(PlaybackState.ACTION_PLAY_PAUSE) .setState(PlaybackState.STATE_PLAYING, 0, 0, 0) .build(); audioSession.setPlaybackState(state); audioSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS); audioSession.setActive(true); 

日志输出:

时间停止了:1473420286380
时间停止了:1473420286383

在我看来,这些价值之间的差异太小了。

我自己解决了这个问题。 诀窍是使用event.getDownTime()以下示例解释它:

  audioSession = new MediaSession(getApplicationContext(), "TAG"); audioSession.setCallback(new MediaSession.Callback() { @Override public boolean onMediaButtonEvent(final Intent mediaButtonIntent) { String intentAction = mediaButtonIntent.getAction(); if (Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { KeyEvent event = mediaButtonIntent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); if (event != null) { stopTimeOfGame_millis = event.getDownTime(); double usersReactionTime = (event.getDownTime() - startTimeOfGame_millis) / 1000.0; UtilsRG.info("event.getDownTime(): " + usersReactionTime); double getEventTime = (event.getEventTime() - startTimeOfGame_millis) / 1000.0; UtilsRG.info("event.getEventTime(): " + getEventTime); int action = event.getAction(); if (action == KeyEvent.ACTION_DOWN) { long action_down = android.os.SystemClock.uptimeMillis(); double actionDown = (action_down - startTimeOfGame_millis) / 1000.0; UtilsRG.info("ACTION_DOWN: " + actionDown); } if (action == KeyEvent.ACTION_UP) { long action_up = android.os.SystemClock.uptimeMillis(); double actionUp = (action_up - startTimeOfGame_millis) / 1000.0; UtilsRG.info("ACTION_UP: " + actionUp); } } } return true; } }); PlaybackState state = new PlaybackState.Builder() .setActions(PlaybackState.ACTION_PLAY_PAUSE) .setState(PlaybackState.STATE_PLAYING, 0, 0, 0) .build(); audioSession.setPlaybackState(state); audioSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS); audioSession.setActive(true); 

我得到了以下日志:

event.getDownTime():0.281

event.getEventTime():0.421

ACTION_DOWN:0.47

ACTION_UP:0.471

因此,现在我得到了用户按下键的那一刻。

特别感谢Balkrishna Rawool