Android - AudioManager.onAudioFocusChange()随机触发

时间:2015-08-31 22:22:26

标签: android android-audiomanager

我正在构建媒体播放器并以类似于文档的方式实施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作为参数似乎是随机的。还有其他人处理过这个问题吗?

1 个答案:

答案 0 :(得分:3)

每次应用请求或释放音频焦点时都会调用onAudioFocusChange()。这可以来自任何应用程序,而不仅仅是您的应用程序。 实际上,每个播放声音的通知(例如文本/邮件/ ...)都会获得焦点,然后释放它。一旦另一个应用程序释放音频焦点,您的应用程序将再次获得焦点,因此将调用您的简历回放。

为了避免在你不想要的时候播放,你可以保留一个布尔值来表明你的应用应该播放:

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
    }
  }
};