最近遇到一个需求:app在播放语音或者视频,或者拨打网络电话的时候,如果正在播放音乐:比如酷狗,网易。需要暂停播放的音乐,当语音播放完以后又继续播放。
先奉上简单链接:https://download.csdn.net/download/qq_25238883/11258226
上代码:
1.获取到音频服务
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
2.在需要暂停的地方抢占播放通道
int ohterAppMusicVolume=0;
/**
* 请求音频焦点,开始播放时候调用
*
* @return
*/
public boolean requestAudioFocus() {
ohterAppMusicVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
if (Build.VERSION.SDK_INT < 23) {
audioManager.setMode(AudioManager.MODE_IN_CALL);
}
return audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
}
3.占用结束的时候在取消占用
/**
* 放弃音频焦点,销毁播放时候调用
*/
public void abandonAudioFocus() {
audioManager.abandonAudioFocus(this);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, ohterAppMusicVolume, 0);
}
代码很简单,目前酷狗,网易云都可以正常暂停与恢复
下面再补充一点:第三方音乐正在播放的时候,接收到新消息:在不暂停当前音乐播放的情况下,让第三方音乐声音减小,播放完提示音后恢复
1.同样是需要拿到媒体播放焦点
private AudioManager mAudioManager;
private int ohterAppMusicVolume=0;
private boolean requestAudioFocus() {
mAudioManager = (AudioManager) getSystemService(Service.AUDIO_SERVICE);
ohterAppMusicVolume=mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
Log.e("音量", "requestAudioFocus: "+ohterAppMusicVolume );
if (Build.VERSION.SDK_INT <= 23) {
mAudioManager.setMode(AudioManager.STREAM_RING);
}
return mAudioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK ) == AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
}
2.设置播放铃声:本地raw文件夹内mp3文件
MediaPlayer player= MediaPlayer.create(MainActivity.this,R.raw.ring);
player.start();
player.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
abandonAudioFocus();
mp.release();
}
});
3.解除占用
/**
* 放弃音频焦点,销毁播放时候调用
*/
public void abandonAudioFocus() {
mAudioManager.abandonAudioFocus(this);
mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, ohterAppMusicVolume, 0);
}
两者的区别主要是在requestAudioFocus()方法中:
1.AudioManager.AUDIOFOCUS_GAIN_TRANSIENT//表示暂用
2.AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK //表示会减小音量播放