2013-08-06 34 views
1

我一直在努力工作一段時間,試圖讓本教程工作(http://united-coders.com/nico-heid/an-android-seekbar-for-your-mediaplayer/),但我沒有任何運氣。音頻播放完美,但SeekBar不會移動。MediaPlayer在Android中工作,但進度不是

package com.example.playingaudio; 

import java.io.FileInputStream; 

import android.app.Activity; 
import android.media.AudioManager; 
import android.media.MediaPlayer; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.SeekBar; 

public class MainActivity extends Activity implements Runnable { 

    private MediaPlayer mediaPlayer; 
    private SeekBar progress; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 

     setContentView(R.layout.activity_main); 
     super.onCreate(savedInstanceState); 
     progress = (SeekBar) findViewById(R.id.seekBar1); 

    } 

    public void playButton(View view) { 
     try { 
      playRecording(); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    protected void playRecording() throws Exception { 
     final MediaPlayer mediaPlayer = new MediaPlayer(); 
     FileInputStream fileStream = new FileInputStream(
       "/sdcard/Download/mySong.mp3"); 
     mediaPlayer.setDataSource(fileStream.getFD()); 
     mediaPlayer.prepare(); // might take long! (for buffering, etc) 
     mediaPlayer.start(); 
     run(); 
    } 

    private void ditchMediaPlayer() { 
     if (mediaPlayer != null) { 
      try { 
       mediaPlayer.release(); 

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

    } 

    @Override 
    public void run() { 
     // mp is your MediaPlayer 
     // progress is your ProgressBar 

     int currentPosition = 0; 
     int total = mediaPlayer.getDuration(); 
     progress.setMax(total); 
     while (mediaPlayer != null && currentPosition < total) { 
      try { 
       Thread.sleep(1000); 
       currentPosition = mediaPlayer.getCurrentPosition(); 
      } catch (InterruptedException e) { 
       return; 
      } catch (Exception e) { 
       return; 
      } 
      progress.setProgress(currentPosition); 
     } 
    } 

} 
+2

爲什麼你在UI線程上首先執行Thread.sleep()?這太soooooooooooo壞了!上帝該死的太糟糕了! –

+0

我試圖按照教程。 – EGHDK

+0

你能分享你的佈局 – Peshal

回答

0

你的酒吧沒有更新的原因是因爲你沒有給它一個機會。你的UI線程上有一個常量循環,主要由sleep()組成。你不能這樣做,並期望UI更新。

如果您仔細查看該教程,您會發現他們不會撥打runOnUiThread()。實際上,底部有一個link back to SO,它顯示了更多的代碼。剛剛創建了一個新的Thread,並且運行了start()。沒什麼太棘手。


實施例:

(調用此方法mediaPlayer.start()後):

private void createProgressThread() { 
    progressUpdater = new Runnable() { 
     @Override 
     public void run() { 
      //... 
      //... 
     } 
    }; 
    Thread thread = new Thread(progressUpdater); 
    thread.start(); 
} 
+0

我調整了我的代碼,我不是流媒體,現在只是在播放一個文件。所以你可以忽略任何流媒體代碼。該文件是本地的,並且播放良好。 – EGHDK

+0

如果您「切換了您的代碼」,最好編輯問題以反映您使用的*精確*代碼。您無法通過查看僞代碼進行調試。 – Geobits

+0

更新謝謝。 – EGHDK

1

嘗試改變該行

final MediaPlayer mediaPlayer = new MediaPlayer(); 

要,這條線

mediaPlayer = new MediaPlayer(); 

原因是你已經有一個類變量mediaPlayer聲明,爲什麼你再次聲明本地變量具有相同的名稱。

相關問題