检测何时按下耳机按钮

时间:2017-02-23 02:55:54

标签: java android

我正在Android Studio中开发一种简单的应用程序,我希望有一个代码可以检测到按下耳机按钮的时间(然后引出并动作)。

我一直在网上搜索并在任何地方搜索,而且我找到的所有脚本都没有用。

由于Android版本的问题,或者因为代码只是"变红"而且由于我不知道的原因,它只是不起作用。 我非常绝望和需要那些代码。如果有人能够分享一个,我会非常感激。

例如,这是我正在使用的代码:

 public static class MediaButtonIntentReceiver extends BroadcastReceiver {
    // int E=0;

    public MediaButtonIntentReceiver() {
        super();
    }


    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();
        if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) { //Si la acción capturada en intentaction no equivale a una puñsación de boton entonces sale de el método debido al return
            MainActivity.E= 7;
            return;
        }
        KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); //extra key se refiere a el de los auriculares
        if (event == null) {         //Si event es null, return. Event equivale a extrakeyevent. osea que si no hay extrakey event, return
            MainActivity.E= 7;    return;
        }
        int action = event.getAction();
        if (action == KeyEvent.ACTION_DOWN) { //Lo que hará cuando sea pulsado

            MainActivity.E= MainActivity.E+1;


            // do something




        }
        abortBroadcast();
    }


}

清单中有以下内容:

<receiver android:name="OuterClass$MediaButtonIntentReceiver">
            <intent-filter   android:priority="2147483647">
                <action android:name="android.intent.action.MEDIA_BUTTON" />
            </intent-filter>
        </receiver>

问题是,当我运行应用程序时,我按下耳机的媒体按钮,Android的MediaPlayer没有任何反应(通常应该发生),这表明,事实上,应用程序在Android的mediaPlayer上具有这些按钮的优先级。然而,应用程序中没有任何事情发生在按下(当它应该发生什么时)。我还要补充一点,当媒体很长时,谷歌的一种应用程序就会被打开。我对长按不感兴趣。

此外,我必须提到,从我提取的地方开始,除了已经看到的代码之外还有更多的代码,例如有类似的东西:

  //AudioManager mAudioManager =  (AudioManager) getSystemService(Context.AUDIO_SERVICE);
       //ComponentName mReceiverComponent = new ComponentName(this, MediaButtonIntentReceiver.class);

    //mAudioManager.registerMediaButtonEventReceiver(mReceiverComponent);

  //  mAudioManager.unregisterMediaButtonEventReceiver(mReceiverComponent);

(这些线被我丢弃了) 无论如何,这段代码不起作用,因为Android工作室说他们已经过时了。

我还发现:

// BroadcastReceiver MediaButtonIntentReceiver = new MediaButtonIntentReceiver();       // MediaButtonIntentReceiver mMediaButtonReceiver = new MediaButtonIntentReceiver();        // IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);         //mediaFilter.setPriority(1000000000);        // registerReceiver(mMediaButtonReceiver,mediaFilter);

我把它放在MainActivity的onCreate中。也没用。

我在本论坛的另一个问题中找到了最后一个代码。 代码的某些部分以红色显示不起作用(回调,返回true(并显示&#34;返回外部方法&#34;)...)

MediaSession audioSession = new MediaSession(getApplicationContext(),&#34; TAG&#34;);     audioSession.setCallback(new MediaSession.Callback){

    //@Override
    public static 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);

更具体一点: enter image description here

我对此感到疯狂。请帮忙。哈哈。 提前谢谢大家!

1 个答案:

答案 0 :(得分:0)

尝试

ACTION_MEDIA_BUTTON意图。

或简单地覆盖Activity onKeyDown方法:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == KeyEvent.KEYCODE_HEADSETHOOK){
        //handle click
        return true;
    }
    return super.onKeyDown(keyCode, event);
}