Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:MediaPlayer AUDIOFOCUS\u LOSS&;setOneErrorListener()问题_Java_Android_Android Audiomanager - Fatal编程技术网

Java Android:MediaPlayer AUDIOFOCUS\u LOSS&;setOneErrorListener()问题

Java Android:MediaPlayer AUDIOFOCUS\u LOSS&;setOneErrorListener()问题,java,android,android-audiomanager,Java,Android,Android Audiomanager,我正在创建一个音乐播放器应用程序 在这种情况下,我正在检查我的应用程序是否丢失了AudioFocus,然后播放将停止。 但这引发了一个问题,即当我播放一首曲目-然后停止播放,然后再播放一首曲目时,切换案例AudioManager.AUDIOFOCUS\u LOSS会被呼叫,在呼叫中,我在播放器失去焦点时停止播放 因此,我自己的应用程序正在失去对自身的关注。 显然,这不是我的意图。 我想在其他音乐播放器请求聚焦时给它打电话 private OnAudioFocusChangeListener fo

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

在这种情况下,我正在检查我的应用程序是否丢失了AudioFocus,然后播放将停止。 但这引发了一个问题,即当我播放一首曲目-然后停止播放,然后再播放一首曲目时,
切换案例AudioManager.AUDIOFOCUS\u 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;
        }
    }
};
还有一个问题,我得到的异常是
非法状态异常

这意味着当代码到达case AudioManager.AUDIOFOCUS\u LOSS内部时,我的MusicLayer处于错误状态。 为了检查这一点,我使用以下方法注册了一个
OnErrorListener

//Inside Service - onCreate() Method
mPlayer.setOnErrorListener(mErrorListener);
但这个监听器永远不会被调用。
我会通知任何帮助。

不幸的是,非法状态异常不会触发OneRorListener调用。您必须尝试/捕获可能触发非法状态异常的部分代码。

我有类似的问题,我强烈怀疑您的
focuschangesetener
是在程序中的某个地方重新创建的,因此您请求关注
focuschangesetener
的不同实例。您是从服务或活动中定义它的吗

这样做的目的是维护您的
focusChangeListener
的一个副本,并将其传递给
requestAudioFocus()
放弃AudioFocus()
;否则,AudiMaMaGER会考虑来自不同源的请求,这会导致应用程序失去对自身的关注。 您应该知道,在同一个侦听器对象上多次调用
requestAudioFocus()
只会注册一次,而调用
放弃AudioFocus()
一次就足以释放音频焦点

可以解决您问题的几点建议:

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

  • >P>如果您的侦听器已注册为活动,则考虑移动到服务,以便侦听器可以 活得更长

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

    • 您的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()
也可以解决这个问题。

如何维护focusChangeListener的单个副本??我已经利用了单打,但有活动切换的球员得到停止焦点丢失。。。你能帮助我吗。。。