1、獲取MediaPlayer實例
(1)可以直接通過new或者create方式:
調用setDataSource和create的區別是,create時已經執行了MediaPlayer.prepare(),而setDataSource需要手動執行。
MediaPlayer mPlayer = new MediaPlayer(); mPlayer.setDataSource(); MediaPlayer mPlayer = MediaPlayer.create();
(2)獲取用戶事先導入到/res的資源文件
private MediaPlayer mPlayer; mPlayer = MediaPlayer.create(this, R.raw.leessang);
(3)獲取存儲在SD卡或者其他路徑下的文件
MediaPlayer mPlayer = new MediaPlayer(); mPlayer.setDataSource("/sdcard/leesang.mp3");
(4)獲取網絡媒體文件
MediaPlayer mPlayer = new MediaPlayer(); mPlayer.setDataSource("http://www.xxxx.com/yyyy.mp3");
2、播放、暫停
對於通過create調用的媒體,無需在播放時調用prepare方法,而對於通過new創建的媒體,則需要調用一次prepare方法才可完成start的啟動。
1 btnStart.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View view) { 4 try { 5 if (mPlayer != null) { 6 if (mPlayer.isPlaying()) { 7 mPlayer.pause(); 8 btnStart.setText("播放"); 9 } else { 10 // mPlayer.prepare(); 11 mPlayer.start(); 12 btnStart.setText("暫停"); 13 } 14 } 15 } catch (Exception e) { 16 e.printStackTrace(); 17 } 18 } 19 });
3、停止播放
當Mediaplayer對象在播放時,可以進行暫停和停止操作,pause方法暫停播放,stop方法停止播放。處於暫停暫停時可通過start方法恢復播放,但是處於停止狀態時則必須先調用prepare方法使其處於准備狀態,再調用start方法。
1 btnStop.setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View view) { 4 try { 5 if (mPlayer != null) { 6 mPlayer.stop(); 7 seekBar.setProgress(mPlayer.getCurrentPosition()); 8 btnStart.setText("播放"); 9 } 10 } catch (Exception e) { 11 e.printStackTrace(); 12 } 13 14 } 15 });
4、通過SeekBar控制播放進度
通過MediaPlayer.getDuration()可以得到媒體文件的長度(單位毫秒),可以將此作為SeekBar的最大值。
通過MediaPlayer.seekTo(int i)可以定位媒體文件的任意位置(單位毫秒),mPlayer.seekTo(seekBar.getProgress());
1 seekBar.setMax(mPlayer.getDuration()); 2 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 3 @Override 4 public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 5 6 } 7 8 @Override 9 public void onStartTrackingTouch(SeekBar seekBar) { 10 11 } 12 13 @Override 14 public void onStopTrackingTouch(SeekBar seekBar) { 15 mPlayer.seekTo(seekBar.getProgress()); 16 } 17 });
5、將播放時間反饋給SeekBar
由於Android沒有提供播放時間反饋方法,所以只能使用定時器或者線程來進行播放反饋。即每隔一定時間來檢查播放進度,按照此進度來調節SeekBar。
1 mTimer = new Timer(); 2 mTimerTask = new TimerTask() { 3 @Override 4 public void run() { 5 seekBar.setProgress(mPlayer.getCurrentPosition()); 6 } 7 }; 8 mTimer.schedule(mTimerTask, 0, 10);
6、小結
// 此處轉載自:http://www.cnblogs.com/dyllove98/p/3192090.html
(1) 當一個MediaPlayer對象被創建或者調用reset()方法之后,它處於空閑狀態,調用release()方法后處於結束狀態
1、一個MediaPlayer對象調用了reset()方法后,再調用其它方法可能會觸發OnErrorListener.onError()事件,未調用reset()方法則不會觸發
2、當Mediaplayer對象不再被使用時,最好調用release()方法對其進行釋放,使其處於結束狀態,此時它不能被使用
3、Mediaplayer對象被創建時(調用構造方法)處於空閑狀態,若使用create()方法創建后則處於准備狀態。
(2) 一般情況下,一些常用的播放控制操作可能因為音頻、視頻的格式不被支持或者質量較差以及流超時,也有可能由於開發者的疏忽使得Mediaplayer對象處於無效狀態等而導致錯誤。此時可通過注冊setOnErrorListener方法實現監控。如果發生了錯誤,Mediaplayer對象將處於多霧狀態,可以使用reset()方法來回復錯誤。
(3) 任何Mediaplayer對象都必須先處於准備狀態,然后才開始播放
(4) 要開始播放Mediaplayer對象都必須成功調用start()方法,可通過isPlaying()方法來檢測是否正在播放
(5) 當Mediaplayer對象在播放時,可以進行暫停和停止操作,pause()方法暫停播放,stop()方法停止播放。處於暫停暫停時可通過start()方法恢復播放,但是處於停止狀態時則必須先調用prepare()方法使其處於准備狀態,再調用start()方法。
7、完整代碼

1 import android.media.MediaPlayer; 2 import android.support.v7.app.AppCompatActivity; 3 import android.os.Bundle; 4 import android.view.View; 5 import android.widget.Button; 6 import android.widget.SeekBar; 7 import android.widget.TextView; 8 9 import java.util.Timer; 10 import java.util.TimerTask; 11 12 public class MainActivity extends AppCompatActivity { 13 14 private Button btnStart; 15 private Button btnStop; 16 private TextView textView; 17 private MediaPlayer mPlayer; 18 private SeekBar seekBar; 19 private Timer mTimer; 20 private TimerTask mTimerTask; 21 22 @Override 23 protected void onCreate(Bundle savedInstanceState) { 24 super.onCreate(savedInstanceState); 25 setContentView(R.layout.activity_main); 26 27 mPlayer = MediaPlayer.create(this, R.raw.leessang); 28 textView = (TextView) findViewById(R.id.textView); 29 textView.setText("MP3播放器"); 30 btnStart = (Button) findViewById(R.id.btnStart); 31 btnStop = (Button) findViewById(R.id.btnStop); 32 seekBar = (SeekBar) findViewById(R.id.seekBar); 33 34 mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { 35 @Override 36 public void onCompletion(MediaPlayer mediaPlayer) { 37 btnStart.setText("播放"); 38 mPlayer.seekTo(0); 39 seekBar.setProgress(0); 40 } 41 }); 42 43 mTimer = new Timer(); 44 mTimerTask = new TimerTask() { 45 @Override 46 public void run() { 47 seekBar.setProgress(mPlayer.getCurrentPosition()); 48 } 49 }; 50 mTimer.schedule(mTimerTask, 0, 10); 51 52 53 seekBar.setMax(mPlayer.getDuration()); 54 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 55 @Override 56 public void onProgressChanged(SeekBar seekBar, int i, boolean b) { 57 58 } 59 60 @Override 61 public void onStartTrackingTouch(SeekBar seekBar) { 62 63 } 64 65 @Override 66 public void onStopTrackingTouch(SeekBar seekBar) { 67 mPlayer.seekTo(seekBar.getProgress()); 68 } 69 }); 70 71 btnStart.setOnClickListener(new View.OnClickListener() { 72 @Override 73 public void onClick(View view) { 74 try { 75 if (mPlayer != null) { 76 if (mPlayer.isPlaying()) { 77 mPlayer.pause(); 78 btnStart.setText("播放"); 79 } else { 80 // mPlayer.prepare(); 81 mPlayer.start(); 82 btnStart.setText("暫停"); 83 } 84 } 85 } catch (Exception e) { 86 e.printStackTrace(); 87 } 88 } 89 }); 90 btnStop.setOnClickListener(new View.OnClickListener() { 91 @Override 92 public void onClick(View view) { 93 try { 94 if (mPlayer != null) { 95 mPlayer.stop(); 96 seekBar.setProgress(mPlayer.getCurrentPosition()); 97 btnStart.setText("播放"); 98 } 99 } catch (Exception e) { 100 e.printStackTrace(); 101 } 102 103 } 104 }); 105 106 } 107 }