Android:MediaPlayer AUDIOFOCUS_LOSS和setOnErrorListener()问题

rei*_*ley 3 java android android-audiomanager

我正在创建一个音乐播放器应用程序.

在那我正在检查我的应用程序是否失去AudioFocus然后播放将停止.但这引发了一个问题,当我播放一首曲目 - 然后停止它 - 然后再次播放曲目时,switch case AudioManager.AUDIOFOCUS_LOSS 正在调用我已停止播放器,因为它正在失去焦点.

所以我自己的应用程序正在失去对自己的关注 显然,这些不是我的意图.当其他一些音乐播放器请求关注时我希望它被调用.

private OnAudioFocusChangeListener focusChangeListener = new OnAudioFocusChangeListener() {
    @Override
    public void onAudioFocusChange(int focusChange) {
        switch (focusChange) {
        case AudioManager.AUDIOFOCUS_LOSS:

            if (mPlayer.isPlaying()) {
                stopPlayback();
            }
            break;
        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
            if (mPlayer.isPlaying()) {
                mPlayer.pause();
            }
            break;
        case AudioManager.AUDIOFOCUS_GAIN:
            if (!mPlayer.isPlaying()) {
                initiatePlayback();
            }
            break;
        }
    }
};
Run Code Online (Sandbox Code Playgroud)

还有一个问题,我得到的例外是IllegalStateException.

这意味着当代码到达内部时case AudioManager.AUDIOFOCUS_LOSS,我的音乐播放器处于某种错误状态.所以要检查一下,我注册了一个OnErrorListener使用:

//Inside Service - onCreate() Method
mPlayer.setOnErrorListener(mErrorListener);
Run Code Online (Sandbox Code Playgroud)

但这个监听器永远不会被调用.我会提供任何帮助.

iTe*_*ech 6

我有类似的问题,我强烈怀疑focusChangeListener你的程序中的某个地方重新创建,所以你要求专注于不同的实例focusChangeListener.您是从服务或活动中定义的吗?

这样做是为了保持一个副本你的focusChangeListener,你传递给requestAudioFocus()abandonAudioFocus(); 否则AudioManager会考虑来自不同来源的请求,这可能会导致应用程序失去对自身的关注.

您应该知道多次调用requestAudioFocus() 同一个侦听器对象只会注册一次,并且调用abandonAudioFocus()一次就足以释放音频焦点.

很少有建议可以解决您的问题:

  • 尝试定义focusChangeListener为静态对象,看看是否有帮助.

  • 如果您的侦听器已在Activity中注册,请考虑转移到服务,以便侦听器可以存活更长时间.

  • 要调试此问题,每当**请求或放弃焦点以确保您拥有时,记录以下**非常有帮助,以确保您正在处理相同的实例:

    • 你的focusChangeListener例如 focusChangeListener.hashCode()
    • 当前上下文对象例如 context.hashCode()
    • 当前的线程ID例如 Thread.currentThread().getId()

例如:

  Log.d(TAG, String.format("Request audio focus: thread id = %s, context = %s, listener = %s",Thread.currentThread().getId(),context.hashCode(),focusChangeListener hashCode())
Run Code Online (Sandbox Code Playgroud)

编辑:

使用应用程序上下文即getApplicationContext()可以解决问题.