最近項目中遇到一個問題,app內音樂后臺播放時,如果有電話或者微信視頻通話進來,app后臺音樂還在播放。這樣就造成用戶體驗不好,研究了市面上的音樂播放器,比如網易云音樂就很好的做到了如果有微信視頻或者語音通話進來時音樂暫停播放。微信視頻掛斷后繼續播放音樂。
相關實現肯定是要監聽音頻相關的一些接口回調。研究了安卓的官方文檔,終于找到解決方案。先貼出我的實現代碼
主要用到了: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;
// 監聽器對象
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);
}
}

根據上面的log可以看出focusChange為1時代表微信視頻結束,我們這個時候繼續我們的后臺音樂播放。focusChange不為1時就暫停音樂播放。
這樣就能實現像網易云音樂那樣。在有微信或qq視頻通話時暫停音樂播放。掛斷時繼續音樂播放。
?
本文摘自 :https://blog.51cto.com/u

