1 音频焦点管理类
/**
* <pre>
* author : jake
* time : 2018/12/26
* function : 音频焦点管理类
* version: 1.2.0
* </pre>
*/
class AudioFocusManager (val context: Context, val listener: AudioManager.OnAudioFocusChangeListener){
fun muteAudio(bMute: Boolean): Boolean {
var isSuccess = false
val am = context?.getSystemService(Context.AUDIO_SERVICE) as AudioManager
isSuccess = if (bMute) {
var result = am.requestAudioFocus(listener,
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT)
(result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
} else {
val result = am.abandonAudioFocus(null)
(result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED)
}
return isSuccess
}
}
2 注册监听
在使用的地方注册监听
audioFocusManager = AudioFocusManager(activity, mOnAudioFocusChangeListener)
3 使用
3.1 其他音频播放,停止当前音频
当失去焦点时,监听回调 onAudioFocusChange 方法,停止音频播放
比如,WebView中的音频播放时,需要停止原生音频。不需方法交互,判断失去焦点,直接停止当前音频即可
/**
* 音频播放,焦点监听
*
* 功能:失去焦点,停止音频播放
*/
private var mOnAudioFocusChangeListener = object : AudioManager.OnAudioFocusChangeListener {
//被其他App切换时,把当前自己的音乐停止
override fun onAudioFocusChange(focusChange: Int) {
if (player?.isPlaying() == true) {
onPause()
}
}
}
3.2 播放当前音频,停止其他音频
// 播放音频时调用,抢夺焦点
audioFocusManager?.muteAudio(true)
// 停止音频播放时调用,释放焦点
audioFocusManager?.muteAudio(false)
你可能会有疑问,为什么不都在 3.1 的监听里做处理呢?
还要抢过来抢过去!多麻烦!
因为使用 WebView 加载的音频(比如一段 html 内容),无法注册这个监听!
所以就只能 暴力掠夺 音频焦点,使其它的音频都播放不了,以达到音频控制的目的!