2009-12-03 206 views

回答

2

当你的活动(或服务)通过电话的地方MediaPlayer#pause()打断成Activity#onPause和代码恢复播放到Activity#onResume我认为这个问题可能是在MediaPlayer在其自己的线程中执行,当你的活动被暂停,它并不意味着MediaPlayer也会自动暂停

+0

问题是,如果用户在应用程序中更改活动,它也会暂停音乐。 – FlySwat 2009-12-03 06:55:30

+0

我同意下面的标记 - 在这一点上,你可以使用PhoneStateListener来检测是否由于电话使用造成的暂停 – Bostone 2009-12-04 00:36:17

+0

如何做到这一点,你可以添加如何做到这一点的代码 – 2013-09-13 13:06:27

5

使用PhoneStateListener可以确定手机何时处于使用状态。

0

我有一个类似的问题。我的HTC Desire HD在电话抵达时会停止播放音乐,但挂断后不会恢复。我发现这是由Viber应用程序引起的,当我删除“Viber”时,一切都恢复正常。现在,当我接到电话时,音乐暂停并在我说完后恢复。

0

在你的应用程序介绍一个PhoneStateListener像这样:

private PhoneStateListener mPhoneListener = new PhoneStateListener() { 
    public void onCallStateChanged(int state, String incomingNumber) { 
     try { 
      switch (state) { 
       case TelephonyManager.CALL_STATE_RINGING: 
        pauseStream(); 
        break; 
       case TelephonyManager.CALL_STATE_OFFHOOK: 
        break; 
       case TelephonyManager.CALL_STATE_IDLE: 
        resumeStream(); 
        break; 
       default: 
      } 
     } catch (Exception e) { 
      Log.e(TAG, e.getMessage()); 
     } 
    } 
}; 

然后你需要把它架在你的onCreate(),或在您的onStartCommand()方法,在服务的情况下:

 radioStream.setAudioStreamType(AudioManager.STREAM_MUSIC); 
     radioStream.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer stream) { 
       telephonyManager = (TelephonyManager) getSystemService(TELEPHONY_SERVICE); 
       telephonyManager.listen(mPhoneListener, PhoneStateListener.LISTEN_CALL_STATE); 
       isMusicPlaying = true; 
       isServiceRunning = true; 
       stream.start(); 
      } 
     }); 
     try { 
      radioStream.prepare(); 
     } catch (IllegalStateException e1) { 
      e1.printStackTrace(); 
      streamErrorHandler(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
      streamErrorHandler(); 
     } 

,你可以实现你的下列方法版本:

public static void pauseStream() { 
    if (isServiceRunning) { 
     if (radioStream.isPlaying()) { 
      isMusicPlaying = false; 
      radioStream.pause(); 
     } 
    } else { 
     Log.i(TAG, "service isn't running"); 
    } 
} 

public static void resumeStream() { 
    if (isServiceRunning) { 
     if (!radioStream.isPlaying()) { 
      isMusicPlaying = true; 
      radioStream.start(); 
     } 
    } else { 
     Log.i(TAG, "service isn't running"); 
    } 
} 

radioStream是您的静态MediaPlayer对象。我在一个服务中使用这个,所以你可以退出isServiceRunning但这应该适用于任何人的情况。

0

这里是永久的解决方案。使用audiomanager获取音频焦点。当来电时,它会调用AUDIOFOCUS_LOSS_TRANSIENT,您可以用该方法暂停媒体播放器。调用后调用AUDIOFOCUS_GAIN方法,只需调用mediaplayer.start方法即可。

private AudioManager.OnAudioFocusChangeListener afChangeListener = new AudioManager.OnAudioFocusChangeListener() { 

      @Override 
    public void onAudioFocusChange(int focusChange) { 
     if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { 
      mMediaPlayer.start();} 

else if(focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT){ 

       mMediaPlayer.pause(); 
}