`
bcyy
  • 浏览: 1809590 次
文章分类
社区版块
存档分类
最新评论

Android中的Audio播放:竞争Audio之Audio Focus的应用

 
阅读更多

Android是多任务系统,Audio系统是竞争资源。Android2.2之前,没有内建的机制来解决多个程序竞争Audio的问题,2.2引入了称作AudioFocus的机制来管理对Audio资源的竞争的管理与协调。本文主要讲解AudioFocus的使用。

按照AudioFocus的机制,在使用AudioStream之前,需要申请AudioFocus,在获得AudioFocus之后才可以使用相应的AudioStream;如果有别的程序竞争你正在使用的AudioStream,你的程序需要在收到通知之后做停止播放或者降低声音的处理。值得指出的是,这种机制是需要合作完成的,需要所有使用Audio资源的程序都按照这种机制来做,而如果有程序在它失去AudioFocus的时候仍然在使用Audio,AudioFocus拿它也没办法。而这一点对于开放系统的Android来说很致命的:用户可能安装没遵守这种机制的程序,或者版本太老还没引入这种机制的程序,这最终会导致很差的用户体验。

对于手机方案公司来说,要做的能做的事情就是教育和培训团队成员以保证自己内建的程序遵守机制没问题,这包括了Android原生的程序、自己开发的程序,以及适配第三方的程序。

一、AudioFocus的申请与释放

下面看与AudioFocus的相关的类:



获取/放弃AudioFocus的方法都在android.media.AudioManager中,获取AudioFocus用requestAudioFocus();用完之后,放弃AudioFocus,用abandonAudioFocus()

其中,参数

返回值,可能是:

二、AudioFocus被抢占与重新获得

由上节中知道,申请/释放AudioFocus时传入了AudioManager.OnAudioFocusChangeListener这个参数,其onAudioFocusChange()方法是Audio Focus被抢占与再次获得通知的地方。所以,每个要使用AudioFocus的程序都要小心实现这个函数,保证AudioFocus实现的一致性。

onAudioFocusChange()方法的focusChange参数指示了该AudioFocus的竞争者对AudioFocus的拥有情况,取值如下:

  • AUDIOFOCUS_GAIN:获得了Audio Focus;
  • AUDIOFOCUS_LOSS:失去了Audio Focus,并将会持续很长的时间。这里因为可能会停掉很长时间,所以不仅仅要停止Audio的播放,最好直接释放掉Media资源。而因为停止播放Audio的时间会很长,如果程序因为这个原因而失去AudioFocus,最好不要让它再次自动获得AudioFocus而继续播放,不然突然冒出来的声音会让用户感觉莫名其妙,感受很不好。这里直接放弃AudioFocus,当然也不用再侦听远程播放控制【如下面代码的处理】。要再次播放,除非用户再在界面上点击开始播放,才重新初始化Media,进行播放。
  • AUDIOFOCUS_LOSS_TRANSIENT:暂时失去Audio Focus,并会很快再次获得。必须停止Audio的播放,但是因为可能会很快再次获得AudioFocus,这里可以不释放Media资源;
  • AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:暂时失去AudioFocus,但是可以继续播放,不过要在降低音量。

下面是onAudioFocusChange()方法处理的代码片段:

  1. OnAudioFocusChangeListenerafChangeListener=newOnAudioFocusChangeListener(){
  2. publicvoidonAudioFocusChange(intfocusChange){
  3. if(focusChange==AudioManager.AUDIOFOCUS_LOSS_TRANSIENT
  4. //Pauseplayback
  5. }elseif(focusChange==AudioManager.AUDIOFOCUS_LOSS){
  6. am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
  7. am.abandonAudioFocus(afChangeListener);
  8. //Stopplayback
  9. }elseif(focusChange==AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK){
  10. //Lowerthevolume
  11. }elseif(focusChange==AudioManager.AUDIOFOCUS_GAIN){
  12. //ResumeplaybackorRaiseitbacktonormal
  13. }
  14. }
  15. };

三、典型的应用AudioFocus的场景

下面的时序图描述了AudioFocus被抢占与再次获取的典型场景:





注意为了描述简单,此图中除了两个竞争Audio Focus的App之外,只用AudioManager表征了Android的AudioFocus机制中内部参与的对象,实际AudioManager只是外部的表象,内部参与的对象很多,回调函数也并非简单的直接由AudioManager调用,其中还包含了复杂的IPC机制。

图中:

  • AudioFocus Client通过requestAudioFocus()获取AudioFocus,在获得AudioFocus之后,开始播放Audio[Step#1 ~ #2];
  • 其它程序(Other App)也通过requestAudioFocus()获取同类AudioStream的AudioFocus [Step#3]
  • AudioFocus Client失去了Audio Focus,在onAudioFocusChanged()中,根据focusChange的值,做第二节中的处理[Step#4];
  • 其它程序(Other App)获取Audio Focus之后,开始播放Audio[Step#5];
  • 其它程序(Other App)使用Audio之后,通过abandonAudioFocus()归还AudioFocus [Step#6];
  • AudioFocus Client重新获得了Audio Focus,可做进一步的处理 [Step#7]

小结

Audio Focus机制要参与各方充分理解并统一遵照施行,有没有遵照者或者实现有误的程序存在就可能打破这一机制,带来糟糕的用户体验。在保证Built-in程序没问题的前提下,如果进入AndroidMarket之前的程序都严格执行了AudioFocus相关的测试,应该也没问题。


分享到:
评论

相关推荐

    Android 蓝牙 音频焦点(Audio Focus)——卡音,多年安卓开发经验,从实际项目中获取到的经验,对安卓开发者非常有

    Android 蓝牙 音频焦点(Audio Focus)——卡音,多年安卓开发经验,从实际项目中获取到的经验,对安卓开发者非常有帮助。

    AudioFocus

    监听手机来电等,切换音乐播放状态

    AudioThief:让您获得并释放AudioFocus

    音频小偷Gradle// app/build.gradledependencies { implementation ' com.github.takusemba:audiothief:x.x.x '}特征 由于多个应用程序可以同时将音频播放到样本输出流,因此需要正确处理AudioFocus。 但是,您不想...

    WhatsappAudioRecorder:使用Android的AudioRecorder和.aac文件扩展名的简单录音机

    有时,Android的类不会释放AudioFocus,因为这样一来,Mic会在下次尝试时停止录制音频,并且用户不知道为什么未录制音频。 使用类,我们可以获得原始的PCM数据,并且可以比较预期的录制字节和录制的音频字节,通过...

    Tools and Techniques for Audio Debugging

    The focus of the techniques presented in this document is the multichannel audio serial port (McASP), which is the audio peripheral in the DRA7xxx Infotainment Application Processor family. Most tools...

    audiofocus-launcher

    AudioFocus启动器 实用程序应用程序,用于测试应用程序的AudioFocus管理 在此应用上,您可以指定流类型,AudioFocus时间和延迟时间来触发AudioFocus请求。

    SRS_Audio_Sandbox1904汉化版

    实际上目前有很多 3D 效果增强软件,但是这些软件多是以播放器插件的形式进行播放的,而 SRS Audio Sandbox 则与之完全不同,它利用操作系统的底层技术,以驱动程序的形式装入系统。实现了不论采用何种声卡,何种...

    SRS Audio Sandbox(声卡效果增强软件) V1.9.0.4 汉化版

    实际上目前有很多3D效果增强软件,但是这些软件多是以播放器插件的形式进行播放的,而SRS Audio Sandbox则与之完全不同,它利用操作系统的底层技术,以驱动程序的形式装入系统。实际上不论采用何种声卡,任何媒体...

    The Busy Coders Guide to Android Development最终版2019

    Key Android Concepts Choosing Your Development Toolchain Tutorial #1 - Installing the Tools Android and Projects Tutorial #2 - Creating a Stub Project Getting Around Android Studio Contents of Android...

    音乐播放器-AndroidApplication

    使用Android来实现音乐播放器,结合了AudioFocus、Android的四大组件。在实现App的同时结合了Widget。

    SRS Audio Sandbox (音频增强)汉化特别版 V1.10

    实际上目前有很多 3D 效果增强软件,但是这些软件多是以播放器插件的形式进行播放的,而 SRS Audio Sandbox 则与之完全不同,它利用操作系统的底层技术,以驱动程序的形式装入系统。实现了不论采用何种声卡,何种...

    CommonsWare.The.Busy.Coders.Guide.to.Android.Development.Version.8.2.2017

    Android, the next-generation open mobile platform from Google and the Open Handset Alliance, is poised to become a significant player in the mobile device market. The Android platform gives developers...

    Audio Focus-crx插件

    Audio Focus将帮助您在当前选项卡中观看视频或听音乐,而无需手动关闭其他选项卡中的声音。 #关于我我是一名在韩国首尔欢呼的软件工程师。 我根据自己的需要开发了Audio Focus。 :)我希望您也能发现它有用!

    SRS Audio Sandbox V1.9.0

    实际上目前有很多3D效果增强软件,但是这些软件多是以播放器插件的形式进行播放的,而SRS Audio Sandbox则与之完全不同,它利用操作系统的底层技术,以驱动程序的形式装入系统。实际上不论采用何种声卡,任何媒体...

    RTP Audio and Video for the Internet

    The focus of the book is media transport: how to reliably deliver audio and video across an IP network, how to ensure high quality in the face of network problems, and how to ensure that the system ...

    環繞立體聲效果 SRS Audio Sandbox 1.10.1.0.rar(含註冊機)

    實際上目前有很多 3D 效果增強軟體,但是這些軟體多是以播放器外掛程式的形式進行播放的,而 SRS Audio Sandbox 則與之完全不同,它利用操作系統的底層技術,以驅動程式的形式裝入系統。 實現了不論採用何種聲卡,...

    srs audio sandbox

    与之前的游戏音乐相比,这时的游 戏音乐重音极具穿透力,时面的乐器声更加清脆抑扬,绵绵环绕于耳,悠悠之情动人心弦,仿佛一下子让人置身于那美轮美奂的游戏仙境之中。 四、唱出自己的精彩 老婆是个KTV爱好者,没事...

    Android代码-ExoPlayerView

    1.Process AudioFocus automatically. 2.Process its orientation by sensor automatically 3.simple gesture action supported. 4.multiple video quality supported 5.you can add custom views to the default ...

Global site tag (gtag.js) - Google Analytics