Android開發手記(14) 使用MediaPlayer播放mp3


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 }
MainActivity.java


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM