在Android中可靠地暂停媒体播放系统

时间:2012-06-30 15:40:13

标签: android android-intent

标题使这个声音比它更简单。我正试图播放一个会暂停大多数音乐播放器的意图。

我知道我可以使用创建一个KeyEvent来广播KEYCODE_MEDIA_PLAY_PAUSE:

    long eventTime = SystemClock.uptimeMillis(); 
    Intent downIntent = new Intent(Intent.ACTION_MEDIA_BUTTON, null);
    KeyEvent downEvent = new KeyEvent(eventTime, eventTime, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE, 0);
    downIntent.putExtra(Intent.EXTRA_KEY_EVENT, downEvent); 
    ctx.sendOrderedBroadcast(downIntent, null);

这很有效。它将暂停股票媒体播放器我想要的方式,以及支持耳机播放/暂停按钮的大多数其他音乐播放器。但由于某种原因,它只适用于股票音乐播放器一次。我可以按下按钮来拨打电话,它会暂停音乐。如果我再次开始播放,然后再次点击暂停按钮,则无效。一旦我重新启动设备,它将再次工作。但是,随着潘多拉的到来,它的工作始终如一。

我想我可以解决这个问题,只是暂停而不使用KeyEvent。我用AudioManager和另一个意图尝试了这个:

    AudioManager mAudioManager = (AudioManager) ctx.getSystemService(Context.AUDIO_SERVICE);    
    if (mAudioManager.isMusicActive()) {
        Intent mediaIntent = new Intent("com.android.music.musicservicecommand");
        mediaIntent.putExtra("command", "pause");
        ctx.sendBroadcast(mediaIntent);
    }

这也有效,并且它始终如一。但它本质上是脆弱的,因为通过将意图直接发送到Android音乐播放器,这是它唯一可以使用的播放器。无法控制Pandora,Last.FM等,我需要它与大多数音乐播放器合作。

我只是不确定下一步该怎么做。只要它有效,我就不会挑剔我给出的解决方案。如果你可以帮助我使KeyEvent工作,太棒了,如果你有一些完全不同的解决方案,太棒了。我只是想让它起作用!谢谢!

2 个答案:

答案 0 :(得分:4)

我也遇到了这个问题。感谢您对它的描述,我想我明白了发生了什么。你发送keydown事件,但从来没有键盘因此系统认为正在连续按下播放/暂停按钮。我成功地使用了这段代码。

Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON);
KeyEvent event = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PLAY); 
mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event);
context.sendBroadcast(mediaEvent);

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
        Intent mediaEvent = new Intent(Intent.ACTION_MEDIA_BUTTON);
        KeyEvent event = new KeyEvent(KeyEvent.ACTION_UP,KeyEvent.KEYCODE_MEDIA_PLAY); 
        mediaEvent.putExtra(Intent.EXTRA_KEY_EVENT, event);
        context.sendBroadcast(mediaEvent);
    }
}, 100);

答案 1 :(得分:2)

要暂停系统范围的音频,您不会启动意图,而是从系统请求音频焦点。

因此,当您希望暂停所有操作时,请执行以下操作(在onCreate中建议):

//The Variables we'll need to create
AudioManager am;
OnAudioFocusChangeListener af;

//I do nothing with this listener, but it's required for the next step.
af = new OnAudioFocusChangeListener() {

      public void onAudioFocusChange(int focusChange) {
          if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {
              // Lower the volume
          } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
              // Raise it back to normal
          }    
      }

}; 

//Do the actual pause
am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
int request = am.requestAudioFocus(af,
    AudioManager.STREAM_MUSIC,
    AudioManager.AUDIOFOCUS_GAIN);

但不要忘记放弃焦点:

am.abandonAudioFocus(af);