我正在构建媒体播放器并以类似于文档的方式实现onAudioFocusChange()
:
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT
// Pause playback
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
// Resume playback
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
am.abandonAudioFocus(afChangeListener);
// Stop playback
}
}
};
唯一奇怪的问题:当我的手机在后台运行应用程序且媒体播放器暂停时,该服务将随机开始播放。当我删除上面的代码时,它不会发生。因此,使用
onAudioFocusChange()
作为参数看似随机地调用了AUDIO_FOCUS_GAIN
。还有其他人处理过这个问题吗? 最佳答案
每当应用程序请求或释放音频焦点时,都会调用onAudioFocusChange()。这可以来自任何应用程序,而不仅仅是您的应用程序。
实际上,每个播放声音的通知(例如文本/邮件/...)都将获得焦点,然后释放它。一旦另一个应用程序释放了音频焦点,您的应用程序将再次获得焦点,因此将调用您的简历播放。
为了避免在您不想播放时播放,可以保留一个 bool 值,指示您的应用程序是否可以播放:
boolean wantsMusic = true;
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT
// Pause playback
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN && wantsMusic) {
// Resume playback
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
am.abandonAudioFocus(afChangeListener);
// Stop playback
}
}
};