Android MediaPlayer在接到电话时不会停止
MediaPlayer在接到电话时不会暂停。如果有人能帮忙,那就太好了 代码:Android MediaPlayer在接到电话时不会停止,android,android-mediaplayer,phone-call,Android,Android Mediaplayer,Phone Call,MediaPlayer在接到电话时不会暂停。如果有人能帮忙,那就太好了 代码: 尝试将这些功能添加到活动中 @Override public void onPause() { super.onPause(); if (mp != null){ if(mp.isPlaying()) mp.pause(); } } @Override public void onResume() { super.onResume(); if (mp != nu
尝试将这些功能添加到活动中
@Override
public void onPause()
{
super.onPause();
if (mp != null){
if(mp.isPlaying())
mp.pause();
}
}
@Override
public void onResume()
{
super.onResume();
if (mp != null){
if(!mp.isPlaying())
mp.prepare();
mp.start();
}
}
@Override
public void onStop()
{
super.onStop();
if (mp != null){
if(mp.isPlaying())
mp.pause();
}
}
您需要一个
AudioManager
来管理音频焦点。下面是它如何工作的简洁解释:
下面是一个简单的示例,演示如何在应用程序中实现它:
尽管在任何给定的时间只能运行一个活动,但Android是一个
多任务环境。这对我们来说是一个特别的挑战
使用音频的应用程序,因为只有一个音频输出
而且可能有多家媒体服务公司在竞争它的使用。之前
Android 2.2,没有解决这个问题的内置机制,
这在某些情况下可能会导致糟糕的用户体验。例如
当用户正在听音乐,而另一个应用程序需要
通知用户一些非常重要的事情,用户可能听不到
由于响亮的音乐而发出的通知音。从Android开始
2.2,该平台为应用程序提供了一种协商使用设备音频输出的方式。这种机制称为音频聚焦
实施示例:
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
// could not get audio focus.
}
....
....
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
// resume playback
if (mMediaPlayer == null) initMediaPlayer();
else if (!mMediaPlayer.isPlaying()) mMediaPlayer.start();
mMediaPlayer.setVolume(1.0f, 1.0f);
break;
case AudioManager.AUDIOFOCUS_LOSS:
// Lost focus for an unbounded amount of time: stop playback and release media player
if (mMediaPlayer.isPlaying()) mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
// Lost focus for a short time, but we have to stop
// playback. We don't release the media player because playback
// is likely to resume
if (mMediaPlayer.isPlaying()) mMediaPlayer.pause();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
// Lost focus for a short time, but it's ok to keep playing
// at an attenuated level
if (mMediaPlayer.isPlaying()) mMediaPlayer.setVolume(0.1f, 0.1f);
break;
}
}
谢谢,这是可行的,但是当电话通话结束并返回到应用程序时,它会崩溃,我会发布有问题的日志。有什么帮助吗?我不知道是否有帮助,但请尝试删除mp.release();从onStop函数。@SteveF:如果停止
MediaPlayer
,则必须在调用start()
之前再次调用prepare()
。在活动
onPause()
方法中,您不应该调用mp.stop()
,而应该调用mp.pause()
。嘿,这是可行的,但现在当您按下后退按钮返回应用程序的主菜单时,它会在崩溃后崩溃。这个解决方案有一个附带条件,每当你最小化你的播放器,它就会停止播放,这是糟糕的用户体验。更好的方法是使用AudioManager选项。另一个选项是注册一个接收器,捕捉来电事件并暂停媒体播放器。也许在这段代码中有必要添加:“case AudioManager.AUDIOFOCUS_LOSS:”代码:“AudioManager.AUDIOFOCUS(this);”?(正如您链接的url中所述:)请参见
@Override
public void onPause()
{
super.onPause();
if (mp != null){
if(mp.isPlaying())
mp.pause();
}
}
@Override
public void onResume()
{
super.onResume();
if (mp != null){
if(!mp.isPlaying())
mp.prepare();
mp.start();
}
}
@Override
public void onStop()
{
super.onStop();
if (mp != null){
if(mp.isPlaying())
mp.pause();
}
}
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
// could not get audio focus.
}
....
....
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
// resume playback
if (mMediaPlayer == null) initMediaPlayer();
else if (!mMediaPlayer.isPlaying()) mMediaPlayer.start();
mMediaPlayer.setVolume(1.0f, 1.0f);
break;
case AudioManager.AUDIOFOCUS_LOSS:
// Lost focus for an unbounded amount of time: stop playback and release media player
if (mMediaPlayer.isPlaying()) mMediaPlayer.stop();
mMediaPlayer.release();
mMediaPlayer = null;
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
// Lost focus for a short time, but we have to stop
// playback. We don't release the media player because playback
// is likely to resume
if (mMediaPlayer.isPlaying()) mMediaPlayer.pause();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
// Lost focus for a short time, but it's ok to keep playing
// at an attenuated level
if (mMediaPlayer.isPlaying()) mMediaPlayer.setVolume(0.1f, 0.1f);
break;
}
}