Android——AudioManager.onAudioFocusChange() 随机触发

标签 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 作为参数看似随机地被调用。还有其他人处理过这个问题吗?

最佳答案

每次应用请求或释放音频焦点时都会调用 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
    }
  }
};

关于Android——AudioManager.onAudioFocusChange() 随机触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32320826/

相关文章:

android - 有没有办法获取当前播放歌曲的信息?

android - 可以获取其他app的audioStream吗

android - 如何在android中的操作栏上添加多个图标?

java - 我是一名新的应用程序开发人员,我不确定如何将项目从 github 插入到我的 android studio 应用程序中

android - 循环 MediaPlayer 之间的小停顿

android - 无法使用 ffmpeg 读取音频流

android - 如何在填充列表后以编程方式更改列表元素的高度

android - Android 无效 ID token 的 Google 登录

java - 带有 Google 依赖项的 Android Studio Gradle assembleDebug 错误

android - AudioManager.isWiredHeadsetOn() 在 android 中不工作