关于一个音频播放器在工作时,打开另一个播放器或者进来电话之类的处理

最近在参与开发一款音频播放类的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,欢迎交流指点

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值