我正在创建一个音乐播放器应用程序。
我正在检查我的应用程序是否丢失 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
,我的音乐播放器处于某种错误状态。
所以为了检查这一点,我注册了一个OnErrorListener
using:
//Inside Service - onCreate() Method
mPlayer.setOnErrorListener(mErrorListener);
但这个监听者永远不会被调用。
我将不胜感激任何帮助。
我有类似的问题,我强烈怀疑你的focusChangeListener
在您的程序中的某个位置重新创建,因此您请求关注不同的实例focusChangeListener
。您是根据服务或活动来定义它的吗?
想法是维持单一副本你的focusChangeListener
你传递给requestAudioFocus()
and 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())
Edit:
使用应用程序上下文,即getApplicationContext()
也可以解决问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)