标题使这个声音比它更简单。我正试图播放一个会暂停大多数音乐播放器的意图。
我知道我可以使用创建一个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工作,太棒了,如果你有一些完全不同的解决方案,太棒了。我只是想让它起作用!谢谢!
答案 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);