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 管理机制下的正常现象