How to listen to “ACTION_DOWN” (key pressed) event in Android onMediaButtonEvent, in order to measure the time?

前端 未结 1 888
醉酒成梦
醉酒成梦 2020-12-06 15:21

I try to get the time System.currentTimeMillis(), than the user presses the media button. But the callback is executed at the time when the media button goes up

相关标签:
1条回答
  • 2020-12-06 15:49

    I fixed the issue by my self. The trick is to use event.getDownTime() Following example explains it:

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

    I got following log:

    event.getDownTime(): 0.281

    event.getEventTime(): 0.421

    ACTION_DOWN: 0.47

    ACTION_UP: 0.471

    Thus now I got the moment when the user presses the key down.

    Special Thanks goes to Balkrishna Rawool

    0 讨论(0)
提交回复
热议问题