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



标题使这听起来比实际简单得多。我正在尝试广播一个会暂停大多数音乐播放器的意图。

我知道我可以使用创建一个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 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音乐播放器,这是它唯一可以使用的播放器。无法控制潘多拉、Last.FM 等,我需要它与大多数音乐播放器配合使用。

我只是不确定下一步该去哪里。只要有效,我不会挑剔我得到什么样的解决方案。如果你能帮助我使KeyEvent工作,太棒了,如果你有一些完全不同的解决方案,太棒了。我只是想让它工作!谢谢!

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

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

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

因此,当您希望暂停所有内容时,请执行以下操作(在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);

虽然彼得布鲁克斯的答案确实有效,但我发现这更好,因为暂停/播放是即时的。在 Android 12 中,当音频首先淡出时,获得音频焦点的速度很慢。

AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
audioManager.dispatchMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MEDIA_PAUSE));
audioManager.dispatchMediaKeyEvent(new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_MEDIA_PAUSE));

最初在此处找到的解决方案:获取应用播放音频的详细信息

最新更新