转载

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、完整代码

Android开发手记(14) 使用MediaPlayer播放mp3
 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
正文到此结束
Loading...