为什么收音机后台播放时,播放视频(音乐),退出视频(音乐)播放后,FM直接退出且不能自动恢复?

1.首先我们需要了解一下Android中对于音频播放的管理机制

Android中应用程序播放音频的时候,必须获取音频焦点,即获取audioFocus。芯方式

要请求音频焦点,必须调用

AudioManager中的requestAudioFocus()方法

同时,

AudioManager.OnAudioFocusChangeListener是申请成功之后监听AudioFocus使用情况的Listener,后续如果有别的程序要竞争AudioFocus,都是通过这个Listener的onAudioFocusChange()方法来通知这个Audio Focus的使用者的。

同时通过这个listener我们监听到的focusChange参数将会告诉你音频焦点是如何改变的,并且能够是下面的值之一(它们是在AudioManager类中定义的常量):

1). AUDIOFOCUS_GAIN:你已经获得音频焦点;

2). AUDIOFOCUS_LOSS:你将会长时间失去音频焦点,必须终止所有的音频播放。因为长时间的失去焦点后,不应该在期望有焦点返回,这是一个尽可能清除不用资源的好位置。例如,

应该在此时释关闭

FM;

3). AUDIOFOCUS_LOSS_TRANSIENT:这说明你临时失去了音频焦点,但是在不久就会再返回来。

此时,你必须终止所有的音频播放,但是保留你的播放资源,因为可能不久就会返回来。

4). AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:这说明你已经临时失去了音频焦点,但允许你安静的播放音频(低音量),而不是完全的终止音频播放。

2.当视频(音乐)进行播放的时候,播放视频(音乐)的应用将会向系统申请audioFocus。

申请的类型为

AudioManager.AUDIOFOCUS_GAIN ,表示应用需要长时间占用音频焦点。

这样会导致

FM的audioFocus状态发生改变 会长时间失去audioFocus 资源。

FM 监听收到的audioFocus 改变状态为AUDIOFOCUS_LOSS,此时FM应该退出。

FMPlayService.java 中的处理逻辑

private synchronized boolean requestAudioFocus() {

if(mAudioFocusListener == null){

mAudioFocusListener = new AudioManager.OnAudioFocusChangeListener() {

@Override

public void onAudioFocusChange(int focusChange) {

if (DEBUG) Log.d(LOGTAG, "AudioFocusChanged " + focusChange);

switch (focusChange) {

case AudioManager.AUDIOFOCUS_LOSS:

mPausedByTransientLossOfFocus = false;

fmUtil.fmSignal2Info(FMUtil.FM_NOTIFY_STATE, FMUtil.FM_STATE_MUSIC_OFF, "off");

fmOff(true);

} ..

...

所以即使退出视频(音乐)播放,此时FM已经关闭,它将无法恢复播放。

这是由于

Android 的audioFocus 管理机制下的正常现象

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Media Playback Android多媒体框架包涵了对播放多种通用媒体的类型的支持,所以你可以很容易的集成...
    VegetableAD阅读 4,402评论 0 0
  • 这节课是 Android 开发(入门)课程 的第二部分《多屏幕应用》的第四节课,导师依然是 Jessica Lin...
    HsuJin阅读 3,262评论 1 9
  • 一、FileProvider 前几天学习了如何分享文字、图片、音乐或其他流文件,那么提供让我们选择文件的应用,比如...
    武曌思阅读 4,650评论 0 0
  • 夜,很静。秋天悄悄的来了。每当这时,我都很想您。假如爱有天意,希望您在天堂安好。 所有人都在说“世上只有妈妈好,而...
    蔓风阅读 1,677评论 1 2
  • 几乎每个人都对自己的水准和能力有着出乎意料高估,而这也是一般考试中60分及格线的由来——留出10分缓冲以抵消掉被高...
    三石大先生阅读 4,373评论 5 18