3

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

我正在检查我的应用程序是否丢失了 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

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

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

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

4

2 回答 2

7

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

这个想法是维护您传递给的单个副本和;否则 AudioManager 将考虑来自不同来源的请求,这可能导致应用程序失去焦点。focusChangeListenerrequestAudioFocus()abandonAudioFocus()

您应该知道,多次调用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())

编辑:

使用应用程序上下文 iegetApplicationContext()也可以解决问题。

于 2013-01-02T20:55:31.087 回答
1

不幸的是 IllegalStateExceptions 不会触发 OnErrorListener 调用。您将不得不尝试/捕获可能触发它们的 IllegalStateExceptions 的部分代码。

于 2012-09-26T08:30:32.193 回答