最近項目中遇到一個問題,app內(nèi)音樂后臺播放時,如果有電話或者微信視頻通話進來,app后臺音樂還在播放。這樣就造成用戶體驗不好,研究了市面上的音樂播放器,比如網(wǎng)易云音樂就很好的做到了如果有微信視頻或者語音通話進來時音樂暫停播放。微信視頻掛斷后繼續(xù)播放音樂。
相關(guān)實現(xiàn)肯定是要監(jiān)聽音頻相關(guān)的一些接口回調(diào)。研究了安卓的官方文檔,終于找到解決方案。先貼出我的實現(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)聽器對象 private MyListener listener; private AudioManager ams = null;//音頻管理器 @Override public IBinder onBind(Intent intent) { return null; } /** * 服務(wù)創(chuàng)建的時候調(diào)用的方法 */ @Override public void onCreate() { // 后臺監(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時代表,接通qq或者微信電話 ams.requestAudioFocus(mAudioFocusListener, 1, 1); } private class MyListener extends PhoneStateListener { // 當(dāng)電話的呼叫狀態(tài)發(fā)生變化的時候調(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ù)銷毀的時候調(diào)用的方法 */ @Override public void onDestroy() { super.onDestroy(); // 取消電話的監(jiān)聽,采取線程守護的方法,當(dāng)一個服務(wù)關(guān)閉后,開啟另外一個服務(wù),除非你很快把兩個服務(wù)同時關(guān)閉才能完成 Intent i = new Intent(this, PhoneService2.class); startService(i); tm.listen(listener, PhoneStateListener.LISTEN_NONE); listener = null; ams.abandonAudioFocus(mAudioFocusListener); } }
根據(jù)上面的log可以看出focusChange為1時代表微信視頻結(jié)束,我們這個時候繼續(xù)我們的后臺音樂播放。focusChange不為1時就暫停音樂播放。
這樣就能實現(xiàn)像網(wǎng)易云音樂那樣。在有微信或qq視頻通話時暫停音樂播放。掛斷時繼續(xù)音樂播放。
?
本文摘自 :https://blog.51cto.com/u