筆記Android — 監聽Line/WeChat網路電話和手機來電狀態切換TelephonyManager & AudioFocusChangeListener

--

在音頻播放中可能會有來電導致中斷,在中斷回復後我們需要將使用者的音頻續撥,那該如何判斷來電狀態的切換呢?

手機來電使用TelephonyManager:

var telephoneManager = context.getSystemService(Service.TELEPHONY_SERVICE) as TelephonyManager
telephoneManager.listen(listener, PhoneStateListener.LISTEN_CALL_STATE)
//監聽方法
private val listener: PhoneStateListener = object : PhoneStateListener() {
override fun onCallStateChanged(state: Int, number: String) {
when (state) {
TelephonyManager.CALL_STATE_IDLE -> {
//狀態回復
}
TelephonyManager.CALL_STATE_RINGING -> {
//偵測來電
}
else -> {
}
}
super.onCallStateChanged(state, number)
}
}

另外使用者也可能收到來自Line/WeChat/Messenger等網路電話,可以透過AudioFocus來監看Focus的變化:

//需要先設定我們的音頻屬性,這邊播放的內容Content type是Music,另外Usage就是一般Media的行為
val musicAudioAttributes = AudioAttributes.Builder().setContentType(AudioAttributes.CONTENT_TYPE_MUSIC).setUsage(AudioAttributes.USAGE_MEDIA).build()
val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
audioManager.requestAudioFocus(AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN).setAudioAttributes(musicAudioAttributes).setAcceptsDelayedFocusGain(true).setOnAudioFocusChangeListener(onAudioFocusRequest).build()
//監看AudioFocus狀態變化
private val onAudioFocusRequest = AudioManager.OnAudioFocusChangeListener {
when (it) {
AudioManager.AUDIOFOCUS_GAIN -> {
// We recovered audio focus.
}
AudioManager.AUDIOFOCUS_LOSS -> {
// Lost focus for an unbounded amount of time
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
// Lost focus for a short time, but it's ok to keep playing at an attenuated level
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
// Lost focus for a short time
}
}
}

針對來電的測試思路比較細節,除了不同的來電來源還需測試各種情境:

如果A打給B,那可能測試情境如下
Case 1 : 電話撥通後A掛斷
Case 2 : 電話撥通後B掛斷
Case 3 : 電話撥通後B接起,A再掛斷
Case 4 : 電話撥通後B接起,B再掛斷

--

--

Mina 's code note 老闆娘的程式筆記.

Android Developer | Florish Accessories品牌合夥人| Workout | Alcohol | Life ✨✨✨