最近在参与开发一款音频播放类的app,其中涉及到两个需求是:
1.不与其他的音视频播放软件同时工作,如果用户在使用该软件的时候又打开了其他的播放器,此时暂停音频播放,直到用户又切换到原来的播放界面再继续播放未播完的音频。
2.当播放音频的时候,用户接起了电话,此时也暂停音频,直到用户接完电话继续播放。
参考:
http://www.linuxidc.com/Linux/2012-04/57902.html
http://blog.csdn.net/winson_jason/article/details/8126856
AudioFocus机制:
按照AudioFocus的机制,在使用AudioStream之前,需要申请AudioFocus,在获得AudioFocus之后才可以使用相应的AudioStream;如果有别的程序竞争你正在使用的AudioStream,你的程序需要在收到通知之后做停止播放或者降低声音的处理。值得指出的是,这种机制是需要合作完成的,需要所有使用Audio资源的程序都按照这种机制来做,而如果有程序在它失去AudioFocus的时候仍然在使用Audio,AudioFocus拿它也没办法。而这一点对于开放系统的Android来说很致命的:用户可能安装没遵守这种机制的程序,或者版本太老还没引入这种机制的程序,这最终会导致很差的用户体验。
对于手机方案公司来说,要做的能做的事情就是教育和培训团队成员以保证自己内建的程序遵守机制没问题,这包括了Android原生的程序、自己开发的程序,以及适配第三方的程序。
1、实例化一个audioManager
由于该项目所有的关于mediaPlayer的操作都封装在了一个service里面了(私以为这是比较科学的方式)
所以audioManager的实例化就写到了service的create里面;
2、添加OnAudioFocusChangeListener监听,该监听是对音频焦点的变化的一个监听,可以实例化一个OnAudioFocusChangeListener的对象,也可以直接继承OnAudioFocusChangeListener这个接口,这两种方法都要重写onAudioFocusChange()这个方法。
3、在音频播放的逻辑之前要添加一个判断,看是否获取到音频的焦点,获取到才执行播放的逻辑;
int result = am.requestAudioFocus(this, //onAudioFocusChangerListener监听对象
AudioManager.STREAM_MUSIC, //音频流的类型,不要提前设置会报错
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK//我们应用跟其他应用共用焦点 我们播放的时候其他音频会降低音量
);
****参数3也可以根据自己的选择设置对应的参数
AUDIOFOCUS_REQUEST_GRANTED 永久获取媒体焦点(播放音乐)
AUDIOFOCUS_GAIN_TRANSIENT 暂时获取焦点 适用于短暂的音频
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK Duck我们应用跟其他应用共用焦点 我们播放的时候其他音频会降低音量
4、重写OnAudioFocusChangeListener监听里面onAudioFocusChange()的方法;
第一次写blog,欢迎交流指点