项目背景 : 音乐或者视频App播放视频或者音乐
设计思想 : 在播放时抢占音频焦点,同时监听音频焦点,在丢失音频焦点时暂停播放。
1.抢占音频焦点
//监听音频焦点
private val audioFocusListener = createOnAudioFocusChangeListener()
//继承AudioManager.OnAudioFocusChangeListener接口
private fun createOnAudioFocusChangeListener(): AudioManager.OnAudioFocusChangeListener {
return object : AudioManager.OnAudioFocusChangeListener {
private var lossTransientVolume = -1
private var wasPlaying = false
override fun onAudioFocusChange(focusChange: Int) {
/*
* Pause playback during alerts and notifications
*/
when (focusChange) {
AudioManager.AUDIOFOCUS_LOSS -> {
Log.i(TAG, "AUDIOFOCUS_LOSS")
// Pause playback
changeAudioFocus(false)
lossTransient = false
service.pause()
LocalBroadcastManager.getInstance(service.applicationContext)
.sendBroadcast(Intent(Parameter.ACTION_AUDIO_LOSS))
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> {
Log.i(TAG, "AUDIOFOCUS_LOSS_TRANSIENT")
// Pause playback
// pausePlayback()
lossTransient = true
wasPlaying = service.isPlaying()
Log.i(TAG, "wasPlaying = $wasPlaying")
if (wasPlaying) service.pause()
}
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> {
Log.i(TAG, "AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK")
// Lower the volume
if (service.isPlaying()) {
val volume = service.getVolume()
lossTransientVolume = volume
service.setVolume(volume / 3)
}
}
AudioManager.AUDIOFOCUS_GAIN -> {
Log.i(TAG, "AUDIOFOCUS_GAIN: ")
// Resume playback
if (lossTransientVolume != -1) {
service.setVolume(lossTransientVolume)
lossTransientVolume = -1
}
// if (lossTransient) {
if (wasPlaying) service.play()
lossTransient = false
// }
}
}
service.audioFocusListener?.onAudioFocusChange(focusChange)
}
}
}
//请求焦点
private fun requestAudioFocus() = audioManager.requestAudioFocus(
audioFocusListener,
AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN
)
audioManager.setParameters("bgm_state=true")
hasAudioFocus = true
play(){
//在播放视频的时候调用请求焦点方法
}
监听音频焦点
//禁止掉请求的音频焦点
private fun abandonAudioFocus() = audioManager.abandonAudioFocus(audioFocusListener)
stop(){
//调用下面方法
}
if (hasAudioFocus) {
abandonAudioFocus()
audioManager.setParameters("bgm_state=false")
hasAudioFocus = false
//上面对音频焦点的监听中处理
AudioManager.AUDIOFOCUS_LOSS -> {
//暂停视频
stop()
}