Java Android:MediaPlayer AUDIOFOCUS\u LOSS&;setOneErrorListener()问题
我正在创建一个音乐播放器应用程序 在这种情况下,我正在检查我的应用程序是否丢失了AudioFocus,然后播放将停止。 但这引发了一个问题,即当我播放一首曲目-然后停止播放,然后再播放一首曲目时,Java Android:MediaPlayer AUDIOFOCUS\u LOSS&;setOneErrorListener()问题,java,android,android-audiomanager,Java,Android,Android Audiomanager,我正在创建一个音乐播放器应用程序 在这种情况下,我正在检查我的应用程序是否丢失了AudioFocus,然后播放将停止。 但这引发了一个问题,即当我播放一首曲目-然后停止播放,然后再播放一首曲目时,切换案例AudioManager.AUDIOFOCUS\u LOSS会被呼叫,在呼叫中,我在播放器失去焦点时停止播放 因此,我自己的应用程序正在失去对自身的关注。 显然,这不是我的意图。 我想在其他音乐播放器请求聚焦时给它打电话 private OnAudioFocusChangeListener fo
切换案例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
- 要调试此问题,在**请求或放弃焦点时记录以下**非常有用,以确保您有,以确保您正在处理相同的实例:
- 您的focusChangeListener,例如
focusChangeListener.hashCode()
- 当前上下文对象,例如
context.hashCode()
- 当前线程id,例如
thread.currentThread().getId()
- 您的focusChangeListener,例如
Log.d(TAG, String.format("Request audio focus: thread id = %s, context = %s, listener = %s",Thread.currentThread().getId(),context.hashCode(),focusChangeListener hashCode())
编辑:
使用应用程序上下文,即
getApplicationContext()
也可以解决这个问题。如何维护focusChangeListener的单个副本??我已经利用了单打,但有活动切换的球员得到停止焦点丢失。。。你能帮助我吗。。。