项目中加入某厂的语音识别技术之后,发现对音频焦点处理这块有点不尽人意。因为本身库里面封装了这一层,导致在外面重写的时候获取一直是 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 做了流氓操作还是挺难受的。至于如何规避就要看各位大佬的骚操作了。