後臺播放音樂時進來電話或微信視頻通話暫停音樂播放 網易雲音樂 喜馬拉雅

最近項目中遇到一個問題,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);
    }

}複製代碼

後臺音樂播放.png
後臺音樂播放.png
根據上面的log能夠看出focusChange爲1時表明微信視頻結束,咱們這個時候繼續咱們的後臺音樂播放。focusChange不爲1時就暫停音樂播放。 這樣就能實現像網易雲音樂那樣。在有微信或qq視頻通話時暫停音樂播放。掛斷時繼續音樂播放。
相關文章
相關標籤/搜索