文档章节

android音乐播放器的音频焦点控制

t
 taoanran
发布于 2014/02/07 11:37
字数 1210
阅读 269
收藏 0

什么叫音频焦点 (audio focus)?

  android系统是一个多任务操作系统,因此同一时刻允许许多任务同时工作。但是这对音频类应用来说是个挑战,因为如果多个音频同时播放的话,很多情况下用户体验会相当的差!比如听音乐时,来了个电话,这时你的耳机里就是电话和音乐共同工作,绝对是个悲剧!

  为了解决这个问题从android2.2开始引入audio focus的概念。当你需要播放音乐或者发送一个通知的时候,你可以去要求获得音频焦点。一旦获得,就可以自由的使用音频输出设备。但是同时它也在时时刻刻的监听着音频焦点的变化。当音频焦点变化时,你需要去合适的处理你的音频输出。

 

音频焦点工作的示例:

第一步

首先你要获得一个音频管理服务AudioManager

        mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);

这个通常在service的oncreate中完成。

 

第二步

然后在合适的地方,比如播放音乐的按钮中放置获得音频焦点的代码

        mAudioManager.requestAudioFocus(mAudioFocusListener,
                AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

requestAudioFocus方法可以获得音频焦点,其有三个参数,解释如下:

第一个参数 OnAudioFocusChangeListener:就是音频焦点变化时的监听器,这是音频焦点控制的重点。

第二个参数streamType:焦点获得之后的数据传输类型,这里是AudioManager.STREAM_MUSIC

第三个参数durationHint :告知系统,你要求获得音频焦点的用途,系统根据你所要求的类型来给其他监听者发出相应的焦点控制参数。有三种可选

      AUDIOFOCUS_GAIN_TRANSIENT:只是短暂获得,一会就释放焦点,比如你只是想发个notification时用下一秒不到的铃声。

     AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:只是背景获得,之前的音频焦点使用者无需释放焦点给我,我将与其共同使用。

     AUDIOFOCUS_GAIN:我要求完全获得焦点,其他人需要释放焦点。比如我要播放音乐了,这时就要抢占整个音频焦点。

 

第三步

实现音频焦点监听器OnAudioFocusChangeListener,这个监听器会根据当前音频焦点的变化,调用onAudioFocusChange(int focusChange)方法,focusChange主要有以下四种参数:

    AUDIOFOCUS_AGIN:你已经完全获得了音频焦点

    AUDIOFOCUS_LOSS:你会长时间的失去焦点,所以不要指望在短时间内能获得。请结束自己的相关音频工作并做好收尾工作。比如另外一个音乐播放器开始播放音乐了(前提是这个另外的音乐播放器他也实现了音频焦点的控制,baidu音乐,天天静听很遗憾的就没有实现,所以他们两个是可以跟别的播放器同时播放的)

    AUDIOFOCUS_LOSS_TRANSIENT:你会短暂的失去音频焦点,你可以暂停音乐,但不要释放资源,因为你一会就可以夺回焦点并继续使用

   AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:你的焦点会短暂失去,但是你可以与新的使用者共同使用音频焦点 

 

具体示例如下:

 

    private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener(){

        public void onAudioFocusChange(int focusChange) {
            switch(focusChange){
                case AudioManager.AUDIOFOCUS_LOSS:
                    if(isPlaying()){
                      //we do not need get focus back in this situation

                      //会长时间失去,所以告知下面的判断,获得焦点后不要自动播放
                        mPausedByTransientLossOfFocus = false;

                        pause();//因为会长时间失去,所以直接暂停
                    }
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                    if(isPlaying()){
                       //短暂失去焦点,先暂停。同时将标志位置成重新获得焦点后就开始播放

                        mPausedByTransientLossOfFocus = true;
                        pause();
                    }
                    break;
                case AudioManager.AUDIOFOCUS_GAIN:

                    //重新获得焦点,且符合播放条件,开始播放
                    if(!isPlaying()&&mPausedByTransientLossOfFocus){
                        mPausedByTransientLossOfFocus = false;
                        resume();
                    }
                    break;
            }
        }};

 

最后

在适当的时候注销掉这个监听器比如在onDestroy()中

        mAudioManager.abandonAudioFocus(mAudioFocusListener);
到此整个音频焦点的控制就完成了

 

 

  讲一个自己的故事,mPausedByTransientLossOfFocus 这个参数一开始没理解有什么作用,就没写。直到发现,我的音乐播放器在我已经手动暂停的情况下,总是在我打完电话后自动播放音乐,才发现他的作用。打完电话,手机就这么一路唱着歌在我的口袋里二逼呵呵的欢乐着。自己还不知道,等再要用手机的时候发现电都被搞掉了不少,且无数人侧目看我是一个怎样的二货喜欢外放音乐.....庆幸手机里没有凤凰传奇的歌曲。

  其实这个参数的作用就是可以让播放器仅仅在短暂失去音频焦点并重新获得后才开始播放音乐。而不是任何时候重新获得焦点都开始播放。


本文转载自:http://blog.sina.com.cn/s/blog_6d552e490101554n.html

共有 人打赏支持
t
粉丝 7
博文 64
码字总数 7186
作品 0
南京
私信 提问
Android 解读开源项目UniversalMusicPlayer(播放控制层)

版权声明:本文为博主原创文章,未经博主允许不得转载 源码:AnliaLee/android-UniversalMusicPlayer 首发地址:Anlia_掘金 大家要是看到有错误的地方或者有啥好的建议,欢迎留言评论 前言 ...

Anlia
2018/04/29
0
0
Android音频焦点与声音重叠

音视频播放在手机日常使用中非常频繁,当我们听着音乐刷着微博时,看到有趣的视频点击开始播放,音乐自动暂停,退出视频时音乐又自动恢复了播放(如果没有自动恢复的话,比如QQ音乐就会提示是...

haoyuan6786
2018/06/07
0
0
Android MediaPlayer

MediaPlayer 这个类主要是播放视频类. AudioManager 这个类管理在一个设备上的音频资源和音频输出流. Manifest声明 1.网络声明 <uses-permission android:name="android.permission.INTERNET...

程序袁_绪龙
2015/01/29
0
4
笔记60 | Android控制音量与音频播放的学习

控制音量与音频播放 编写:kesenhoo 良好的用户体验应该是可预期且可控的。如果我们的应用可以播放音频,那么显然我们需要做到能够通过硬件按钮,软件按钮,蓝牙耳麦等来控制音量。 同样地,我...

项勇
2017/12/28
0
0
Android媒体播放---Media playback(四)

作为前台服务来运行 服务经常被用来执行后台服务,如获取Mail,同步数据,下载内容等。在这些场景中,用户是不关心服务的执行,甚至是这些服务被中断然后在重新开始也不太关注。 但是在播放音...

长平狐
2012/10/16
395
0

没有更多内容

加载失败,请刷新页面

加载更多

泛型就这么简单

前言 从今天开始进入Java基础的复习,可能一个星期会有一篇的<十道简单算法>,我写博文的未必都是正确的~如果有写错的地方请大家多多包涵并指正~ 今天要复习的是泛型,泛型在Java中也是个很...

群星纪元
22分钟前
2
0
大数据提醒你:中国这些古建筑,可能是下一个巴黎圣母院!

大家晚上好,我是今天的提笔人嗅嗅。 巴黎圣母院失火事件让我的心情很沉重,一句无关痛痒的安慰“巴黎不哭”,已经不能表达我对这场文化之殇的惋惜之痛,人类伟大的建筑在一瞬间被毁灭。 世界...

forespider
34分钟前
0
0
mysql函数substring_index的用法

substring_index 按索引字符位进行截取字符串 substring_index(“待截取的字符串”,“截取数据依据的字符”,截取字符的位置N) 第三个参数可正,可负。正数表示索引字符前面的字符串,负数...

echojson
34分钟前
1
0
好程序员web前端分享用CSS和JS打造一个简单的图片编辑器

好程序员web前端分享用CSS和JS打造一个简单的图片编辑器,本文主要是利用CSS的 filter和简单的Jquery代码来实现一个简单的图片编辑器,包括对图片的透明度,黑白,图片亮度等调节。 CSS filt...

好程序员IT
43分钟前
2
0
浅析spring mvc的细节

spring mvc 整体结构 系统监听到请求 -> 通知tomcat -> 根据web.xml 通知相应的拦截器(spring mvc 通常指DispatcherServlet) --> 检查url是否有相匹配的请求实现 --> 拿到请求实现bean的适配...

最爱肉肉
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部