• Android开发-使用MediaPlayer播放mp3音乐
  • 发布于 2个月前
  • 329 热度
    0 评论
获取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.hello-code.com/test.mp3");

播放、暂停

对于通过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.         });  
停止播放

当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.         });  
通过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.         });  

将播放时间反馈给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, 010);  

小结

(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()方法。 

完整代码

  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, 010);  
  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. }  
  108. MainActivity.java  
用户评论