2009-12-03 141 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(); 
} 
相關問題