后台播放音乐时微信视频或电话进来暂停音乐播放

最近项目中遇到一个问题,app内音乐后台播放时,如果有电话或者微信视频通话进来,app后台音乐还在播放。这样就造成用户体验不好,研究了市面上的音乐播放器,比如网易云音乐就很好的做到了如果有微信视频或者语音通话进来时音乐暂停播放。微信视频挂断后继续播放音乐。
相关实现肯定是要监听音频相关的一些接口回调。研究了安卓的官方文档,终于找到解决方案。先贴出我的实现代码

主要用到了:AudioManager.OnAudioFocusChangeListener

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);
    }

}
后台音乐播放.png

根据上面的log可以看出focusChange为1时代表微信视频结束,我们这个时候继续我们的后台音乐播放。focusChange不为1时就暂停音乐播放。
这样就能实现像网易云音乐那样。在有微信或qq视频通话时暂停音乐播放。挂断时继续音乐播放。

推荐阅读更多精彩内容