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