Overview
在http://blog.sina.com.cn/s/blog_645b74b90101e74f.html中(借用人家的哈。)非常清晰的阐述了AudioFocus这个stack的数据结构,阐述了requestAudioFocus的三个参数的不同。我这篇主要介绍request的流程和比较重要方法。
android中,为了避免多个声音同时出现造成极不好的用户体验,从android2.2开始引入audiofocus的机制来管理对Audio资源的竞争的管理与协调。
但是其实这这是个游戏规则,与如何播放的声音没关系,不能强制要求所有APP都遵守,所以仍然有很多不遵守这种游戏规则的软件。
Workflow
一个app request音频焦点的流程如上所示。先判断当前request的client端是否满足以下的条件,满足,则放入栈中,并且调用propagateFocusLossFromGain_syncAf()通知被压下去的client。<br/>
整个流程中比较重要,有较多逻辑判断的部分集中在MediaFocusControl中的requestAudioFocus()这个方法,主要做了一下几个事:<br/>
1.检查是否拥有权限:"android.Manifest.permission.MODIFY_PHONE_STATE",不拥有返回false(这个判断在AudioService.java中)。
2.检查