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

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

最近項(xiàng)目中遇到一個(gè)問(wèn)題,app內(nèi)音樂(lè)后臺(tái)播放時(shí),如果有電話(huà)或者微信視頻通話(huà)進(jìn)來(lái),app后臺(tái)音樂(lè)還在播放。這樣就造成用戶(hù)體驗(yàn)不好,研究了市面上的音樂(lè)播放器,比如網(wǎng)易云音樂(lè)就很好的做到了如果有微信視頻或者語(yǔ)音通話(huà)進(jìn)來(lái)時(shí)音樂(lè)暫停播放。微信視頻掛斷后繼續(xù)播放音樂(lè)。
相關(guān)實(shí)現(xiàn)肯定是要監(jiān)聽(tīng)音頻相關(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;
    // 電話(huà)管理器
    private TelephonyManager tm;
    // 監(jiān)聽(tīng)器對(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īng)電話(huà)的呼叫狀態(tài)。
        // 得到電話(huà)管理器
        tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE);
        listener = new MyListener();
        tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);
        initAudio();
        super.onCreate();
    }

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

    private class MyListener extends PhoneStateListener {

        // 當(dāng)電話(huà)的呼叫狀態(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ù)播放音樂(lè)
                        Log.v("myService", "空閑狀態(tài)");
                        break;
                    case TelephonyManager.CALL_STATE_RINGING://鈴響狀態(tài)。
                      //暫停播放音樂(lè)
                        Log.v("myService", "鈴響狀態(tài)");
                        break;
                    case TelephonyManager.CALL_STATE_OFFHOOK://通話(huà)狀態(tài)

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

    /**
     * 服務(wù)銷(xiāo)毀的時(shí)候調(diào)用的方法
     */
    @Override
    public void onDestroy() {
        super.onDestroy();
        // 取消電話(huà)的監(jiān)聽(tīng),采取線(xiàn)程守護(hù)的方法,當(dāng)一個(gè)服務(wù)關(guān)閉后,開(kāi)啟另外一個(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);
    }

}

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

?

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

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