可以做招商的网站,网站开发兼职成都,微网站 制作平台,东莞网站推广大全尽管某个时刻只有一个activity可以运行#xff0c;Android却是一个多任务环境#xff0e;这对使用音频的应用带来了特殊的挑战#xff0c;因为只有一个音频输出而可能多个媒体都想用它#xff0e;在Android2.2之前#xff0c;没有内建的机制来处理这个问题#xff0c;所以…尽管某个时刻只有一个activity可以运行Android却是一个多任务环境这对使用音频的应用带来了特殊的挑战因为只有一个音频输出而可能多个媒体都想用它在Android2.2之前没有内建的机制来处理这个问题所以可能在某些情况下导致坏的用户体验例如当一个用户正在听音乐而另一个应用需要通知用户一些重要的事情时用户可能由于音乐声音大而不能听的通知从Android2.2开始平台为应用提供了一个协商它们如何使用设备音频输出的途径这个机制叫做音频焦点AudioManager。当你的应用需要输出像乐音和通知之类的音频时你应该总是请求音频焦点一旦应用具有了焦点它就可以自由的使用音频输出但它总是应该监听焦点的变化如果被通知丢失焦点它应该立即杀死声音或降低到静音水平(有一个标志表明应选择哪一个)并且仅当重新获得焦点后才恢复大声播放。首先注册一个焦点监听器OnAudioFocusChangeListener 。privateAudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener null;//Build.VERSION.SDK_INT表示当前SDK的版本Build.VERSION_CODES.ECLAIR_MR1为SDK 7版本 //因为AudioManager.OnAudioFocusChangeListener在SDK8版本开始才有。if(Build.VERSION.SDK_INT Build.VERSION_CODES.ECLAIR_MR1){mAudioFocusChangeListener newAudioManager.OnAudioFocusChangeListener() {OverridepublicvoidonAudioFocusChange(intfocusChange) {if(focusChange AudioManager.AUDIOFOCUS_LOSS){//失去焦点之后的操作if(isPlaying()){pause();}}elseif(focusChange AudioManager.AUDIOFOCUS_GAIN){//获得焦点之后的操作}}};}要请求音频焦点你必须从AudioManager mAudioMgr调用requestAudioFocus()如下所示privatevoidrequestAudioFocus() {if(Build.VERSION.SDK_INT Build.VERSION_CODES.ECLAIR_MR1){return;}if(mAudioMgr null)mAudioMgr (AudioManager) ApplicationEx.app.getSystemService(Context.AUDIO_SERVICE);if(mAudioMgr !null) {DLog.i(TAG, Request audio focus);intret mAudioMgr.requestAudioFocus(mAudioFocusChangeListener,AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);if(ret ! AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {DLog.i(TAG, request audio focus fail. ret);}}}放弃焦点privatevoidabandonAudioFocus() {if(Build.VERSION.SDK_INT Build.VERSION_CODES.ECLAIR_MR1){return;}if(mAudioMgr !null) {DLog.i(TAG, Abandon audio focus);mAudioMgr.abandonAudioFocus(mAudioFocusChangeListener);mAudioMgr null;}}参数focusChange告诉你音频焦点如何发生了变化它可以是以上几种值(它们都是定义在AudioManager中的常量)AUDIOFOCUS_GAIN:你已获得了音频焦点AUDIOFOCUS_LOSS:你已经丢失了音频焦点比较长的时间了你必须停止所有的音频播放因为预料到你可能很长时间也不能再获音频焦点所以这里是清理你的资源的好地方比如你必须释放MediaPlayerAUDIOFOCUS_LOSS_TRANSIENT:你临时性的丢掉了音频焦点很快就会重新获得你必须停止所有的音频播放但是可以保留你的资源因为你可能很快就能重新获得焦点AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:你临时性的丢掉了音频焦点但是你被允许继续以低音量播放而不是完全停止当第三方播放器也使用了这个机制的话当你的应用获取声音焦点之后第三方播放器失去焦点做了暂停处理即会停止播放。这样就不会出现两个播放器同时播放音乐的情况了。而如果第三方播放器没有经过处理不管有没有焦点都一直播放那就没有办法了。 。||