當(dāng)前位置:首頁 > IT技術(shù) > 微信平臺(tái) > 正文

安卓音樂播放時(shí)微信視頻微信語音電話進(jìn)來音樂暫停播放
2021-08-08 14:04:00

最近項(xiàng)目中遇到一個(gè)問題,app內(nèi)音樂后臺(tái)播放時(shí),如果有電話或者微信視頻通話進(jìn)來,app后臺(tái)音樂還在播放。這樣就造成用戶體驗(yàn)不好,研究了市面上的音樂播放器,比如網(wǎng)易云音樂就很好的做到了如果有微信視頻或者語音通話進(jìn)來時(shí)音樂暫停播放。微信視頻掛斷后繼續(xù)播放音樂。
相關(guān)實(shí)現(xiàn)肯定是要監(jiān)聽音頻相關(guān)的一些接口回調(diào)。研究了安卓的官方文檔,終于找到解決方案。先貼出我的實(shí)現(xiàn)代碼

主要用到了: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;
    // 監(jiān)聽器對(duì)象
    private MyListener listener;
    private AudioManager ams = null;//音頻管理器

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    /**
     * 服務(wù)創(chuàng)建的時(shí)候調(diào)用的方法
     */
    @Override
    public void onCreate() {
        // 后臺(tái)監(jiān)聽電話的呼叫狀態(tài)。
        // 得到電話管理器
        tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
        listener = new MyListener();
        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
        initAudio();
        super.onCreate();
    }

    //微信,qq通話監(jiān)聽
    private void initAudio() {
        ams = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
        ams.getMode();//這里getmode返回值為3時(shí)代表,接通qq或者微信電話
        ams.requestAudioFocus(mAudioFocusListener, 1, 1);
    }

    private class MyListener extends PhoneStateListener {

        // 當(dāng)電話的呼叫狀態(tài)發(fā)生變化的時(shí)候調(diào)用的方法
        @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://空閑狀態(tài)。
            //繼續(xù)播放音樂
                        Log.v("myService", "空閑狀態(tài)");
                        break;
                    case TelephonyManager.CALL_STATE_RINGING://鈴響狀態(tài)。
                      //暫停播放音樂
                        Log.v("myService", "鈴響狀態(tài)");
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK://通話狀態(tài)

                        Log.v("myService", "通話狀態(tài)");
                        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) {//視頻語音掛斷狀態(tài)
                if (isChangeToPause) {
                    GlobalAudioManager.getInstance().playResume();
                    Log.d("qcl111", "playResume()" + focusChange);
                }
            } else {//微信或者qq語音視頻接通狀態(tài)
                if (GlobalAudioManager.getInstance().isPlaying()) {
                    isChangeToPause = true;
                    GlobalAudioManager.getInstance().playPause();
                    Log.d("qcl111", "playPause()" + focusChange);
                }
            }
        }
    };

    /**
     * 服務(wù)銷毀的時(shí)候調(diào)用的方法
     */
    @Override
    public void onDestroy() {
        super.onDestroy();
        // 取消電話的監(jiān)聽,采取線程守護(hù)的方法,當(dāng)一個(gè)服務(wù)關(guān)閉后,開啟另外一個(gè)服務(wù),除非你很快把兩個(gè)服務(wù)同時(shí)關(guān)閉才能完成
        Intent i = new Intent(this, PhoneService2.class);
        startService(i);
        tm.listen(listener, PhoneStateListener.LISTEN_NONE);
        listener = null;
     ams.abandonAudioFocus(mAudioFocusListener);
    }

}

安卓音樂播放時(shí)微信視頻微信語音電話進(jìn)來音樂暫停播放_(tái)微信
根據(jù)上面的log可以看出focusChange為1時(shí)代表微信視頻結(jié)束,我們這個(gè)時(shí)候繼續(xù)我們的后臺(tái)音樂播放。focusChange不為1時(shí)就暫停音樂播放。
這樣就能實(shí)現(xiàn)像網(wǎng)易云音樂那樣。在有微信或qq視頻通話時(shí)暫停音樂播放。掛斷時(shí)繼續(xù)音樂播放。

?

本文摘自 :https://blog.51cto.com/u

開通會(huì)員,享受整站包年服務(wù)立即開通 >