Android音乐编程:管理音频焦点

本文详细介绍了在Android环境中管理音频焦点的原理与实践,包括如何请求和释放音频焦点,处理焦点丢失的情况,以及利用音频焦点进行音乐播放的优化。通过理解音频焦点的概念和API使用,开发者可以确保其应用在多任务环境下正常播放音频,提升用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载自:http://mobile.51cto.com/android-309321.htm

Android音乐编程:管理音频焦点

2011-12-23 10:17 zhourunsheng 润物无声的博客 我要评论(0)字号: T| T
一键收藏,随时查看,分享好友!

因为系统中可能会有多个应用程序会播放音频,所以需要考虑他们之间该如何交互,为了避免多个应用程序同时播放音乐,Android 系统使用音频焦点来进行统一管理,即只有获得了音频焦点的应用程序才可以播放音乐。

AD:

您的应用程序在开始播放音频文件前,首先应该请求获得音频焦点,并且应该同时注册监听音频焦点的丢失通知,即如果音频焦点被系统或其他的应用程序抢占时,您的应用程序可以做出合适的响应。

获取音频焦点

您的应用程序在开始播放任何音频之前,首先应该持有流的音频焦点。

可以通过调用requestAudioFocus()来实现,如果请求成功,返回AUDIOFOCUS_REQUEST_GRANTED

您必须指定流类型(使用的是哪一个流)和音频焦点的类型(短暂的或是持久的)。

瞬态焦点用来播放很短时间的音频(例如,播放导航指令)。

持久焦点用来播放较长一段时间的音频(例如,播放音乐)。

下面的代码片断演示了请求音乐音频流的永久音频焦点。

例如当用户按下播放背景音乐的按键,您应该立即请求音频焦点,当成功获得了焦点后再开始播放音乐。


  
  1. AudioManageram=mContext.getSystemService(Context.AUDIO_SERVICE);
  2. ...
  3. //Requestaudiofocusforplayback
  4. intresult=am.requestAudioFocus(afChangeListener,
  5. //Usethemusicstream.
  6. AudioManager.STREAM_MUSIC,
  7. //Requestpermanentfocus.
  8. AudioManager.AUDIOFOCUS_GAIN);
  9. if(result==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
  10. am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
  11. //Startplayback.
  12. //开始播放音乐文件
  13. }

一旦您的应用程序完成了播放,请记得要调用abandonAudioFocus()方法来通知系统释放音频焦点,同时注销相关的AudioManager.OnAudioFocusChangeListener。这样当您的应用程序释放了音频焦点,则系统会允许其他被中断的应用程序重新获取该焦点来继续播放。


  
  1. //Abandonaudiofocuswhenplaybackcomplete
  2. am.abandonAudioFocus(afChangeListener);

当请求瞬态音频焦点时有一个附加参数可供设置,即是否允许“DUCK”。通常当应用程序失去了音频焦点时应该停止播放。如果获取短暂音频焦点的时候设置了”DUCK”附加参数,则允许其他的应用程序继续播放,不需要停止,只要降低音量就可以了,然后直到您的应用程序释放了焦点,其他应用程序再重新获得的时候,将音量还原到有一开始的状态。


  
  1. //Requestaudiofocusforplayback
  2. intresult=am.requestAudioFocus(afChangeListener,
  3. //Usethemusicstream.
  4. AudioManager.STREAM_MUSIC,
  5. //Requestpermanentfocus.
  6. AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);
  7. if(result==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
  8. //Startplayback.
  9. }

“DUCK”特别适合那种间歇性播放音频流的应用程序,如驾驶导航的声音提示。

每当其他的应用程序请求获得音频焦点(永久性的,短暂的,短暂并且支持DUCK的)的时候,您应用程序中注册的音频焦点监听器都会收到相应的消息通知。

处理音频焦点的丢失

如果您的应用程序可以请求音频焦点,那么当其他应用程序申请的时候,您的应用程序也可能会丢失音频焦点。怎么样应对音频焦点丢失的情况则取决于音频焦点丢失的方式。

当音频焦点丢失时,您注册的监听函数onAudioFocusChange()会收到一个事件通知,通知中的参数包括了具体的信息,比如是永久焦点丢失,短暂焦点丢失,还是短暂焦点且允许DUCK的焦点丢失。

通常,如果是短暂焦点的丢失,您的应用程序应该暂停当前的播放,但其他状态信息继续保持,并且应该持续监听音频焦点的改变,一旦重新获得了音频焦点,则可以马上恢复到以前的播放状态。

假如是永久焦点的丢失,则通常意味着其他应用程序要长时间播放音频了,您的应用程序应该停止播放,放弃音频焦点的监听,并注销所有的媒体按钮监听器,从而让获得焦点的其他应用程序来监听媒体播放控制按钮的按键消息。如果要恢复您应用程序的播放状态,则通常需要用户重新启动您的应用程序。

在下面的代码片段中,如果丢失的是短暂音频焦点,则暂定当前应用程序的播放,如果丢失的是永久音频焦点,则停止当前应用程序的播放,停止监听音频焦点的变更,并注销媒体按钮事件的监听。


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

如果丢失的短暂音频焦点允许DUCK状态,在这种情况下,应用程序降低音量继续播放,不需要暂停。

Duck!

DUCK:降低您应用程序的音量,从而不会打扰其他应用程序音频的播放。

在下面的代码片段中,当我们失去焦点的时候,降低了媒体播放的音量,重新获得焦点的时候,将音量恢复到原来的状态。


  
  1. OnAudioFocusChangeListenerafChangeListener=newOnAudioFocusChangeListener(){
  2. publicvoidonAudioFocusChange(intfocusChange){
  3. if(focusChange==AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
  4. //Lowerthevolume
  5. }elseif(focusChange==AudioManager.AUDIOFOCUS_GAIN){
  6. //Raiseitbacktonormal
  7. }
  8. }
  9. };

音频焦点的丢失是非常重要的一种系统状态变化通知,系统会广播很多有关音频状态变化的通知,您的应用程序应该监听这些变化,并作出合适的应对方案,从而提高用户的音乐体验。

参考文摘:

http://developer.android.com/training/managing-audio/audio-focus.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值