在做voip通話的過程中,會(huì)頻繁使用到免提播放和聽筒接聽的功能涤伐,而如何正確的切換馒胆,和AudioManager的調(diào)度是分不開的缨称,直接上代碼:
//獲取AudioManager服務(wù)
private val audioManager =
AppUtils.getApplication().getSystemService(Context.AUDIO_SERVICE) as AudioManager
/**
* 揚(yáng)聲器切換
* true: 打開
*/
fun setSpeakerPhoneOn(on: Boolean) {
if (on) {
//設(shè)置mode
audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
//設(shè)置音量,解決有些機(jī)型切換后沒聲音或者聲音突然變大的問題
audioManager.setStreamVolume(
AudioManager.STREAM_VOICE_CALL,
audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL),
AudioManager.FX_KEY_CLICK
)
//揚(yáng)聲器開啟祝迂,此方法調(diào)用之前需要先設(shè)置好mode
audioManager.isSpeakerphoneOn = true
} else {
//5.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//設(shè)置mode
audioManager.mode = AudioManager.MODE_IN_COMMUNICATION
//設(shè)置音量睦尽,解決有些機(jī)型切換后沒聲音或者聲音突然變大的問題
audioManager.setStreamVolume(
AudioManager.STREAM_VOICE_CALL,
audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL),
AudioManager.FX_KEY_CLICK
)
} else {
//設(shè)置mode
audioManager.mode = AudioManager.MODE_IN_CALL
audioManager.setStreamVolume(
AudioManager.STREAM_VOICE_CALL,
audioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL),
AudioManager.FX_KEY_CLICK
)
}
//揚(yáng)聲器關(guān)閉,此方法調(diào)用之前需要先設(shè)置好mode
audioManager.isSpeakerphoneOn = false
}
}
/**
* 麥克風(fēng)開關(guān)
* RINGER_MODE_SILENT 靜音,且無振動(dòng)
* RINGER_MODE_VIBRATE 靜音,但有振動(dòng)
* RINGER_MODE_NORMAL 正常聲音,振動(dòng)開關(guān)由setVibrateSetting決定.
* true:靜音
*/
fun setVoiceOn(on: Boolean) {
audioManager.isMicrophoneMute = on
// ToastUtils.shortBottom(if (on) "麥克風(fēng)已關(guān)閉" else "麥克風(fēng)已啟用")
}
/**
* 重設(shè)audioManager狀態(tài)
* 揚(yáng)聲器切換為NORMAL && 打開麥克風(fēng)
*/
fun resetAudioState() {
//設(shè)置mode 為喇叭播放
audioManager.mode = AudioManager.MODE_NORMAL
//設(shè)置音量型雳,解決有些機(jī)型切換后沒聲音或者聲音突然變大的問題
audioManager.setStreamVolume(
AudioManager.STREAM_MUSIC,
audioManager.getStreamVolume(AudioManager.STREAM_MUSIC),
AudioManager.FX_KEY_CLICK
)
audioManager.isSpeakerphoneOn = true
setVoiceOn(false)
}
方法調(diào)用代碼如上当凡,下面來分析一下使用中要重點(diǎn)注意的元素:
1.audioManager.mode
AudioManager中給出了如下mode種類,正確的選擇mode進(jìn)行配置纠俭,才能提升用戶體驗(yàn)沿量;
/**
* Invalid audio mode.
*/
public static final int MODE_INVALID = AudioSystem.MODE_INVALID;
/**
* Current audio mode. Used to apply audio routing to current mode.
*/
public static final int MODE_CURRENT = AudioSystem.MODE_CURRENT;
/**
* Normal audio mode: not ringing and no call established.
*/
public static final int MODE_NORMAL = AudioSystem.MODE_NORMAL;
/**
* Ringing audio mode. An incoming is being signaled.
*/
public static final int MODE_RINGTONE = AudioSystem.MODE_RINGTONE;
/**
* In call audio mode. A telephony call is established.
*/
public static final int MODE_IN_CALL = AudioSystem.MODE_IN_CALL;
/**
* In communication audio mode. An audio/video chat or VoIP call is established.
*/
public static final int MODE_IN_COMMUNICATION = AudioSystem.MODE_IN_COMMUNICATION;
在VOIP場景中,主要就是為了通話服務(wù)柑晒,所以選擇mode的時(shí)候欧瘪,設(shè)置為MODE_IN_COMMUNICATION 就比較合適,如果設(shè)置為MODE_NORMAL 去開啟揚(yáng)聲器匙赞,就可能會(huì)出現(xiàn)和其他音頻播放聲音混雜佛掖,甚至互相干擾嘯叫嚴(yán)重的問題。