标签:
Android系统Audio焦点的常用的操作方法如下:
无论你想暂时或是永久地申请audio焦点,你应该指定哪一个audio stream你将会使用。在你期望播放一段短时间的音频的时候申请一个瞬间的audio焦点(例如播放导航指示音),在你播放长时音频的时候申请永久的audio焦点(例如播放音乐)。
1 AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); 2 ... 3 4 // Request audio focus for playback 5 int result = am.requestAudioFocus(afChangeListener, 6 // Use the music stream. 7 AudioManager.STREAM_MUSIC, 8 // Request permanent focus. 9 AudioManager.AUDIOFOCUS_GAIN); 10 11 if(result ==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){ 12 am.registerMediaButtonEventReceiver(RemoteControlReceiver); 13 // Start playback. 14 }
一旦你播放完音乐,一定要记住调用 abandonAudioFocus()方法,该方法会通知系统你不再需要audio焦点并且注销之前关联的 AudioManager.OnAudioFocusChangeListener监听器。在短暂地放弃焦点的情况下,android系统允许被打断的App继续播放音乐。
1 // Abandon audio focus when playback complete 2 am.abandonAudioFocus(afChangeListener);
在注册临时的audio焦点的时候你还有一个可选的操作方法:你是否想使用“ducking”机制。通常的,当一个正在播放音乐的app丢失audio焦点的时候,它就会立刻停止播放。通过使用“ducking”的方法来请求一个临时的焦点则可以避免上述情况,该机制允许正在播放音乐的App调低音量接着播放,直到audio焦点返还给它们,音量重新恢复。
1 // Request audio focus for playback 2 int result = am.requestAudioFocus(afChangeListener, 3 // Use the music stream. 4 AudioManager.STREAM_MUSIC, 5 // Request permanent focus. 6 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); 7 8 if(result ==AudioManager.AUDIOFOCUS_REQUEST_GRANTED){ 9 // Start playback. 10 }
“ducking”机制特别适合于仅需要短暂地获取audio焦点的场景,利用在利用导航软件听取导航指示时。
其他的App无论何时如上述的方法请求audio焦点,是想获取永久的audio焦点或者是临时的audio焦点(不管是否支持“ducking”机制),它们都是通过它们注册的监听器来获取audio焦点的。
如果你的App能够请求audio焦点,那么在众多的app都在请求audio焦点的时候它们会轮流地丢失焦点。你的App在丢失audio焦点的时候如何反应是根据丢失焦点的方式决定的。
你注册的audio焦点监听器通常会有一个 onAudioFocusChange()回调函数,它会携带一个描述audio焦点变化事件的变量。特别的,可能发生的audio焦点丢失事件与之前的焦点请求类型是对应的,有永久丢失,临时丢失以及允许“ducking”机制的临时丢失。
如果audio焦点丢失是永久的,应用程序已经被用户播放音乐了,那么你的app应该做出有效的响应。在实际操作中,通常是你的app需要停止播放,移除多媒体按钮事件的监听,允许正在播放音乐的播放器专一地处理那些事件,同时取消掉你自己的audio焦点。在这个时候,你应该设计出一种用户的操作(例如在你的app中点击播放),通过该操作来重新恢复你的音乐播放。
下面的代码片段展示出了在临时丢失audio焦点时,我们暂停我们的音乐播放,在重新获取audio焦点时,我们恢复播放。如果audio焦点是永久地丢失,则注销我们的多媒体按钮事件监听器,并且停止对audio焦点变化的监听。
1 AudioManager.OnAudioFocusChangeListener afChangeListener = 2 newAudioManager.OnAudioFocusChangeListener(){ 3 publicvoid onAudioFocusChange(int focusChange){ 4 if(focusChange == AUDIOFOCUS_LOSS_TRANSIENT){ 5 // Pause playback 6 }elseif(focusChange ==AudioManager.AUDIOFOCUS_GAIN){ 7 // Resume playback 8 }elseif(focusChange ==AudioManager.AUDIOFOCUS_LOSS){ 9 am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); 10 am.abandonAudioFocus(afChangeListener); 11 // Stop playback 12 } 13 } 14 };
Duck!
“ducking”机制是在其他的app申请audio焦点的时候降低你的app使用的audio steam的音量,从而避免直接屏蔽掉你的app的一种机制。
1 OnAudioFocusChangeListener afChangeListener =newOnAudioFocusChangeListener(){ 2 publicvoid onAudioFocusChange(int focusChange){ 3 if(focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK){ 4 // Lower the volume 5 }elseif(focusChange ==AudioManager.AUDIOFOCUS_GAIN){ 6 // Raise it back to normal 7 } 8 } 9 };
2-管理Audio焦点(Managing Audio Playback)
标签:
原文地址:http://www.cnblogs.com/xlk0101/p/5100265.html