Android 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

MediaPlayer在接到电话时不会暂停。如果有人能帮忙,那就太好了

代码:


尝试将这些功能添加到活动中

@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;
    }
}