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
原文地址:https://www.cnblogs.com/doodle777/p/MediaPlayer_Usage.html