如何收听" ACTION_DOWN" (关键按下)事件在Android onMediaButtonEvent中,为了衡量时间?

时间:2016-09-09 11:12:17

标签: java android

我尝试获得时间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

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

1 个答案:

答案 0 :(得分:6)

我自己解决了这个问题。诀窍是使用 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