Android 音频焦点 AudioFocus 介绍和使用

       项目中加入某厂的语音识别技术之后,发现对音频焦点处理这块有点不尽人意。因为本身库里面封装了这一层,导致在外面重写的时候获取一直是 focusChange = -1 。所以在外面就没有办法操作了,最后还是在发现问题的时候总结下来发给他们的工程师。现在项目到了一个阶段之后,稍微有点时间就总结下音频焦点这块的知识了。

当然首先还是要先看文档会比较好,这里有一个官方的文档连接,需要翻墙:

https://developer.android.com/guide/topics/media-apps/volume-and-earphones

 在我理解中,音频焦点会出现在项目中有音频播放之类的功能时,加上之后用户体验会好很多。遵循正常的音频焦点规则,获取焦点播放音频,暂时失去焦点(如:打电话,QQ语音,微信语音),那么我们就要暂停我们的音频资源或者降低音量。否则就会造成混音的现象,用户体验就大大降低了。永久失去焦点时,我们应该清空释放资源。因为这个时候焦点就不在我们这边了。这个时候如果需要的话,应该重新请求(比如:打开播放)。在这里有一点不得不吐槽一下酷狗音乐,因为这个APP没有做音频焦点。很正常检测就是打开两个App进行对比,比如:网易云,QQ音乐,酷狗。就单单酷狗音乐是不会暂停的,无论你做什么操作都会一直播放(当然还是可以它暂停的)这一点就非常不好的。做播放器同学遇到这个问题怎么解决啊?

下面直接上代码:

  •  获取焦点
    public boolean requestFocus() {
        if (mOnAudioFocusChangeListener != null) {
            return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==
                    mAudioManager.requestAudioFocus(mOnAudioFocusChangeListener,
                            AudioManager.STREAM_MUSIC,
                            AudioManager.AUDIOFOCUS_GAIN);
        }
        return false;
    }
  • 释放焦点
    public boolean abandonFocus() {
        if (mOnAudioFocusChangeListener != null) {
            return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==
                    mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);
        }
        return false;
    }
  • 监听方法

    private AudioManager.OnAudioFocusChangeListener mOnAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
        @Override
        public void onAudioFocusChange(int focusChange) {
            switch (focusChange) {
                case AudioManager.AUDIOFOCUS_LOSS:
                    //此状态表示,焦点被其他应用获取 AUDIOFOCUS_GAIN 时,触发此回调,需要暂停播放。
                    LogManager.d("AUDIOFOCUS_LOSS");
                    stopPlay();
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                    //短暂性丢失焦点,如播放视频,打电话等,需要暂停播放
                    stopPlay();
                    LogManager.d("AUDIOFOCUS_LOSS_TRANSIENT");
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                    //短暂性丢失焦点并作降音处理,看需求处理而定。
                    LogManager.d("AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
                    break;
                case AudioManager.AUDIOFOCUS_GAIN:
                    //别的应用申请焦点之后又释放焦点时,就会触发此回调,恢复播放音乐
                    LogManager.d("AUDIOFOCUS_GAIN");
                    startPlay();
                    break;
            }
        }
    };

主要的功能上面都做介绍,至于如何运用还是看大家的需求了。在我看来,这块地方需要处理的地方还是蛮多的。某些 App 做了流氓操作还是挺难受的。至于如何规避就要看各位大佬的骚操作了。

发布了48 篇原创文章 · 获赞 10 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/jacksinrow/article/details/84139585