为什么收音机后台播放时,播放视频(音乐),退出视频(音乐)播放后,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 管理机制下的正常现象

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