2017-08-29 70 views
10

我在某些設備上播放音樂時遇到奇怪的行爲。當音頻第一次開始播放時,位置跳轉並播放,直到緩衝完全結束。我開始於sample code from Tutorials Point。 我在OnCreate()創建的MediaPlayer這樣:Android MediaPlayer - 位置在緩衝時跳過

// Create Media Player 
mediaPlayer = new MediaPlayer(); 
mediaPlayer.setOnBufferingUpdateListener(this); 
mediaPlayer.reset(); 
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC); 
prepareMediaPlayer(); 

prepareMediaPlayer設置這樣的數據:

private void prepareMediaPlayer() { 

    try { 
     mediaPlayer.setDataSource(myurl); 
     mediaPlayer.prepareAsync(); 
     mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { 
      @Override 
      public void onPrepared(MediaPlayer mp) { 
       Toast.makeText(getApplicationContext(), 
         "Playing sound",Toast.LENGTH_SHORT).show(); 

       mediaPlayer.start(); 

      } 
     }); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

onBufferingUpdate打印出緩衝進度:

@Override 
public void onBufferingUpdate(MediaPlayer mediaPlayer, int bufferingProgress) { 
    Log.v(TAG, "onBufferingUpdate() "+bufferingProgress + 
      "\ncurrentposition: "+mediaPlayer.getCurrentPosition()); 

    seekbar.setSecondaryProgress(bufferingProgress); 
} 

和日誌輸出我收到了演示,當媒體播放器仍在緩衝時,位置如何跳躍。我已經在幾個設備上測試過了,這隻發生在Moto G.這是固件中的錯誤還是我做錯了什麼?

08-29 12:50:17.934 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 4 
                       currentposition: 0 
08-29 12:50:17.934 277/com.test.mediaplayer D/MediaPlayer: setSubtitleAnchor in MediaPlayer 
08-29 12:50:17.976 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 4 
                       currentposition: 0 
08-29 12:50:18.014 27927-27945/com.test.mediaplayer V/RenderScript: 0xb7912ee8 Launching thread(s), CPUs 4 
08-29 12:50:21.414 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 8 
                       currentposition: 7 
08-29 12:50:34.930 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 11 
                       currentposition: 9 
08-29 12:50:50.085 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 15 
                       currentposition: 4 
08-29 12:51:32.991 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 19 
                       currentposition: 2 
08-29 12:53:25.036 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 22 
                       currentposition: 5 
08-29 12:53:51.976 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 26 
                       currentposition: 1 
08-29 12:56:26.004 27927-27946/com.test.mediaplayer I/MediaHTTPConnection: proxyName: 0.0.0.0 0 
08-29 12:56:34.651 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 30 
                       currentposition: 10 
08-29 12:56:35.862 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 33 
                       currentposition: 1102 
08-29 12:56:38.211 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 37 
                       currentposition: 4 
08-29 12:56:40.097 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 41 
                       currentposition: 9 
08-29 12:56:43.034 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 44 
                       currentposition: 9 
08-29 12:56:45.130 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 48 
                       currentposition: 3 
08-29 12:56:49.841 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 52 
                       currentposition: 8 
08-29 12:56:52.500 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 55 
                       currentposition: 8 
08-29 12:56:55.748 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 63 
                       currentposition: 7 
08-29 12:56:57.080 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 74 
                       currentposition: 1223 
08-29 12:56:59.072 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 81 
                       currentposition: 979 
08-29 12:57:00.073 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 81 
                       currentposition: 1979 
08-29 12:57:03.596 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 88 
                       currentposition: 5 
08-29 12:57:05.862 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 92 
                       currentposition: 4 
08-29 12:57:08.291 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 95 
                       currentposition: 8 
08-29 12:57:13.903 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 99 
                       currentposition: 9 
08-29 12:57:14.904 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 100 
                       currentposition: 668 
08-29 12:57:34.261 277/com.test.mediaplayer V/audio-player: onBufferingUpdate() 100 
                       currentposition: 224068 
+0

爲什麼在同一個mediaPlayer實例上調用兩次setOnPreparedListener?第一次在onCreate()方法中,像'mediaPlayer.setOnPreparedListener(this)',然後在prepareMediaPlayer()方法中創建並設置一個新的'mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener()'。 –

+0

@StasysSkliutas You '對,第一個'setOnPreparedListener'是一個錯誤,我把它刪除了,但結果沒有改變 – Evelyn

+0

一些額外的信息會有幫助,哪些android版本的代碼運行成功,在哪個版本的android代碼失敗?什麼是源代碼流,我從代碼中假設它是一個遠程資源?這種行爲是否發生在任何文件上,例如song1.mp3,song2.mp3,...或者只是針對一個特定文件? –

回答

2

有一個在developer docs與此相關的說明:

有一個新建的MediaPlayer對象和復位後的MediaPlayer對象()之間的微妙但重要的區別被調用。這是一個編程錯誤調用處於空閒狀態的方法,如getCurrentPosition()......這兩種情況下

它還補充道:

需要注意的是在準備狀態是很重要瞬態狀態以及在MediaPlayer對象處於「準備」狀態時調用具有副作用的任何方法的行爲未定義。

現在看來,這是不安全的,你打電話getCurrentPosition()直到onPrepared後回調。該解決方案可能會在緩衝時暫停播放。

+0

良好的信息,但即使我刪除了調用'getCurrentPosition()'的日誌行,它仍然播放不正常。 MediaPlayer直到'onPrepared'偵聽器中的'mediaPlayer.start()'纔開始播放,因此在處於「準備」或「空閒」狀態時不會調用任何內容。 – Evelyn

+0

所以你看到了拇指跳,或聽到了音頻?你有一個示例應用程序的地方? –

+0

拇指和音頻都跳轉。示例代碼的鏈接存在問題,我添加的唯一代碼顯示在上面。 – Evelyn