最近項(xiàng)目中遇到一個(gè)問(wèn)題,app內(nèi)音樂(lè)后臺(tái)播放時(shí),如果有電話或者微信視頻通話進(jìn)來(lái),app后臺(tái)音樂(lè)還在播放。這樣就造成用戶體驗(yàn)不好,研究了市面上的音樂(lè)播放器,比如網(wǎng)易云音樂(lè)就很好的做到了如果有微信視頻或者語(yǔ)音通話進(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; // 電話管理器 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)電話的呼叫狀態(tài)。 // 得到電話管理器 tm = (TelephonyManager) this.getSystemService(TELEPHONY_SERVICE); listener = new MyListener(); tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE); initAudio(); super.onCreate(); } //微信,qq通話監(jiān)聽(tīng) 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ù)播放音樂(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://通話狀態(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) {//視頻語(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(); // 取消電話的監(jiān)聽(tīng),采取線程守護(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); } }
根據(jù)上面的log可以看出focusChange為1時(shí)代表微信視頻結(jié)束,我們這個(gè)時(shí)候繼續(xù)我們的后臺(tái)音樂(lè)播放。focusChange不為1時(shí)就暫停音樂(lè)播放。
這樣就能實(shí)現(xiàn)像網(wǎng)易云音樂(lè)那樣。在有微信或qq視頻通話時(shí)暫停音樂(lè)播放。掛斷時(shí)繼續(xù)音樂(lè)播放。
?
本文摘自 :https://blog.51cto.com/u