1)在一个安卓项目中,我编写了一个后台播放音乐的服务。问题是当我的应用程序在后台播放音乐时,另一个应用程序(音乐播放器)播放音乐时,两个音频同时播放。如果任何其他应用程序播放音乐,我想停止在我的应用程序中播放音乐。我该如何处理?
这是我解决问题的方法。
实现OnAudioFocusChangeListener监听器
初始化AudioManager
如下:
private AudioManager mAudioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
请求音频焦点
mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
覆盖 OnAudioFocusChangeListener
的以下方法:
public void onAudioFocusChange(int focusChange)
{
switch (focusChange)
{
case AudioManager.AUDIOFOCUS_GAIN:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
resumePlayer(); // Resume your media player here
break;
case AudioManager.AUDIOFOCUS_LOSS:
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
pausePlayer();// Pause your media player here
break;
}
}
在Android中,这个概念被称为音频焦点。
广义上来说,它意味着一次只有一个应用程序可以获得音频焦点,如果被要求,你应该放弃它(例如接听电话或其他应用程序想播放音乐等)。
为了实现这一点,您需要注册一个OnAudioFocusChangeListener
。
基本上,您必须:
请参阅 Android 文档中的 管理音频焦点文章。
private boolean reqAudioFocus() {
boolean gotFocus = false;
int audioFocus = am.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
if (audioFocus == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
gotFocus = true;
} else {
gotFocus = false;
}
return gotFocus;
}
当您启动应用程序时,如果其他音乐应用程序已在运行,则会请求音频焦点。因此,这将停止已经在运行的应用程序并启动您的应用程序。
if (reqAudioFocus()) {
mPlayer.prepareAsync();
}
将此代码粘贴到您想要准备媒体播放器的位置。
反之,当其他应用程序播放时,您的应用程序应该停止。
使用:
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
am.abandonAudioFocus(this);
mPlayer.stop();
}
}
其中“am”是您的AudioManager实例。
不要忘记实现AudioManager.OnAudioFocusChangeListener。