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、小结
(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