Android 音频焦点控制(包含 原生 & WebView 音频播放控制)

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 内容),无法注册这个监听!
所以就只能 暴力掠夺 音频焦点,使其它的音频都播放不了,以达到音频控制的目的!

猜你喜欢

转载自blog.csdn.net/weixin_34129696/article/details/86879164