安卓:MediaPlayer的AUDIOFOCUS_LOSS&setOnErrorListener(

2019-06-26 20:48发布

我创建一个音乐播放器应用程序。

在我检查,如果我的应用程序失去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;
        }
    }
};

还有一个问题 ,那异常,我得到的是IllegalStateException

这意味着,当里面的代码达到case AudioManager.AUDIOFOCUS_LOSS ,我musicplayer是一些错误的状态。 所以要检查,我注册了一个OnErrorListener使用:

//Inside Service - onCreate() Method
mPlayer.setOnErrorListener(mErrorListener);

但这个监听器永远不会被调用。 我会appreteate任何帮助。

Answer 1:

我有类似的问题,我强烈怀疑你focusChangeListener所以你要求专注于不同实例的地方重新在你的程序focusChangeListener 。 你是从服务或活动定义呢?

这样做是为了保持你的单一副本 focusChangeListener你传递给requestAudioFocus()abandonAudioFocus() ; 否则AudioManager会考虑不同来源的要求,这可能会导致应用程序可以失去焦点本身。

你应该知道,调用requestAudioFocus() 在同一个侦听器对象很多次没有注册它只有一次 ,调用abandonAudioFocus()一次就足以释放音频焦点。

一些建议,能解决你的问题:

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

  • 如果你的听众在活动注册,考虑到移动到服务,以便听者可以存活更长的时间。

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

    • 你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())

编辑:

使用应用程序上下文即getApplicationContext()可以解决这个问题为好。



Answer 2:

不幸的是IllegalStateExceptions不触发OnErrorListener电话。 你将不得不的try / catch在你的代码的部分用于他们可能被触发IllegalStateExceptions。



文章来源: Android: MediaPlayer AUDIOFOCUS_LOSS & setOnErrorListener() issue