最近项目中遇到一个问题,app内音乐后台播放时,若是有电话或者微信视频通话进来,app后台音乐还在播放。这样就形成用户体验很差,研究了市面上的音乐播放器,好比网易云音乐就很好的作到了若是有微信视频或者语音通话进来时音乐暂停播放。微信视频挂断后继续播放音乐。
相关实现确定是要监听音频相关的一些接口回调。研究了安卓的官方文档,终于找到解决方案。先贴出个人实现代码android
##主要用到了:AudioManager.OnAudioFocusChangeListenerbash
package qcl.com; import android.app.Service; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.os.IBinder; import android.telephony.PhoneStateListener; import android.telephony.TelephonyManager; import android.util.Log; /** * Description: * Author : qcl * Date : 17/11/9 */ public class PhoneService extends Service { private boolean isChangeToPause = false; // 电话管理器 private TelephonyManager tm; // 监听器对象 private MyListener listener; private AudioManager ams = null;//音频管理器 @Override public IBinder onBind(Intent intent) { return null; } /** * 服务建立的时候调用的方法 */ @Override public void onCreate() { // 后台监听电话的呼叫状态。 // 获得电话管理器 tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); listener = new MyListener(); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); initAudio(); super.onCreate(); } //微信,qq通话监听 private void initAudio() { ams = (AudioManager) getSystemService(Context.AUDIO_SERVICE); ams.getMode();//这里getmode返回值为3时表明,接通qq或者微信电话 ams.requestAudioFocus(mAudioFocusListener, 1, 1); } private class MyListener extends PhoneStateListener { // 当电话的呼叫状态发生变化的时候调用的方法 @Override public void onCallStateChanged(int state, String incomingNumber) { super.onCallStateChanged(state, incomingNumber); Log.d("qcl111", "state" + state); try { switch (state) { case TelephonyManager.CALL_STATE_IDLE://空闲状态。 //继续播放音乐 Log.v("myService", "空闲状态"); break; case TelephonyManager.CALL_STATE_RINGING://铃响状态。 //暂停播放音乐 Log.v("myService", "铃响状态"); break; case TelephonyManager.CALL_STATE_OFFHOOK://通话状态 Log.v("myService", "通话状态"); break; default: break; } } catch (Exception e) { e.printStackTrace(); } } } private AudioManager.OnAudioFocusChangeListener mAudioFocusListener = new AudioManager.OnAudioFocusChangeListener() { public void onAudioFocusChange(int focusChange) { Log.d("qcl111", "focusChange----------" + focusChange); if (focusChange == 1) {//视频语音挂断状态 if (isChangeToPause) { GlobalAudioManager.getInstance().playResume(); Log.d("qcl111", "playResume()" + focusChange); } } else {//微信或者qq语音视频接通状态 if (GlobalAudioManager.getInstance().isPlaying()) { isChangeToPause = true; GlobalAudioManager.getInstance().playPause(); Log.d("qcl111", "playPause()" + focusChange); } } } }; /** * 服务销毁的时候调用的方法 */ @Override public void onDestroy() { super.onDestroy(); // 取消电话的监听,采起线程守护的方法,当一个服务关闭后,开启另一个服务,除非你很快把两个服务同时关闭才能完成 Intent i = new Intent(this, PhoneService2.class); startService(i); tm.listen(listener, PhoneStateListener.LISTEN_NONE); listener = null; ams.abandonAudioFocus(mAudioFocusListener); } }复制代码