6

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

我知道我可以使用创建一个 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);

那行得通。它将按照我的意愿暂停股票媒体播放器,以及支持耳机播放/暂停按钮的大多数其他音乐播放器。但由于某种原因,它只能与股票音乐播放器一起使用一次。我可以按下按钮来调用它,它会暂停音乐。如果我再次开始播放,然后再次按下暂停按钮,它就不起作用了。一旦我重新启动设备,它就会再次工作。但是,对于 Pandora,它可以始终如一地工作。

我想我也许可以解决这个问题,然后在不使用 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 工作,太棒了,如果你有一些完全不同的解决方案,太棒了。我只是想让它工作!谢谢!

4

3 回答 3

5

我也遇到过这个。感谢您对它的描述,我想我明白发生了什么。您发送 keydown 事件,但从未向系统发送 keyup 事件,因此系统认为播放/暂停按钮被连续按下。我成功使用了这段代码。

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);
于 2013-05-10T02:30:05.530 回答
3

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

因此,当您希望暂停一切时,请执行以下操作(在 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);
于 2012-08-22T23:53:31.137 回答
0

虽然彼得布鲁克斯的回答确实有效,但我发现这效果更好,因为暂停/播放是立即的。在 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));

最初在这里找到的解决方案: 获取应用程序播放音频的详细信息

于 2021-12-18T05:20:57.147 回答