我此刻有一个奇怪的错误。我正在使用 AudioManager 播放循环剪辑,但首先请求音频焦点:

private void startPlayer(Sound sound) {

    audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
    int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

    if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
        initMediaPlayer(sound);
    } else {
        Toast.makeText(getApplicationContext(), "Could not play audio at the moment...", Toast.LENGTH_LONG).show();
    }
}

在我的 stop()方法中,我正在运行:

....  
if (player != null) {
    if (player.isPlaying()) {
        player.stop();
    }

    player.reset();
    player.release();
    player = null;
}
....

在我的 start 方法中...and 我使用以下方法初始化播放器:

...
player = MediaPlayer.create(getApplicationContext(), lookupSoundId(sound));
player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
player.setLooping(true);
player.start();
...

我已经实现了一个 onAudioFocusChange 方法,如果其他东西播放音频,它会停止音频。一切都很完美。

@Override
public void onAudioFocusChange(int focusChange) {
    switch (focusChange) {

        case AudioManager.AUDIOFOCUS_GAIN:
            if (player == null) {
                initMediaPlayer(currentSound);
            } else {
                if (!player.isPlaying()) {
                    play(); // this method updates the UI and starts the player
                }
            }
            player.setVolume(1.0f, 1.0f);
            break;

        case AudioManager.AUDIOFOCUS_LOSS:
            Log.d("onAudioFocusChange", "AudioManager.AUDIOFOCUS_LOSS");
            if ((player != null) && (player.isPlaying())) {
                stop(); // this method updates the UI and stops the player
            }
            break;

        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
            Log.d("onAudioFocusChange", "AudioManager.AUDIOFOCUS_LOSS_TRANSIENT");
            if ((player != null) && (player.isPlaying())) {
                player.pause();
            }
            break;

        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
            Log.d("onAudioFocusChange", "AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");
            if ((player != null) && (player.isPlaying())) {
                player.setVolume(0.2f, 0.2f);
            }
            break;
    }
}

我的问题被描述为一系列步骤,因为它有点奇怪,它在安装了 Android L 开发人员预览(LPV79)的 Nexus 5 上运行:

  • 在我的应用程序中按播放,循环开始播放

  • 按我的应用程序暂停,循环停止

  • 无限重复这个广告,一切都很顺利

  • 在我的应用程序中按播放然后打开 Google 音乐播放器并按播放 - 我的应用程序停止播放并开始播放音乐

  • 在 Google 音乐播放器中按暂停键

  • 回到我的应用程序

  • 在我的应用程序中按播放,循环开始播放

  • 按我的应用程序暂停,循环停止

  • 按我的应用程序中的播放和 UI 更新,就像播放音频但没有播放音频一样

  • 按我的应用程序中的暂停然后播放然后暂停然后播放等但没有音频将播放,虽然 UI 正在更新并且代码似乎都在运行且没有 errors/warnings

  • EITHER:终止 Google 音乐播放器应用,然后在我的应用中按播放,循环开始播放

  • 或者:等待 5 分钟,然后在我的应用程序中按播放,循环开始播放

另外,在我的 stop()方法结束时,我正在调用 audioManager.abandonAudioFocus(...);说我现在不需要音频焦点。

令人讨厌的是,当我尝试调试它并放入断点时,音频播放正常。我不确定是什么导致了它。 :/