转载

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...