zoukankan      html  css  js  c++  java
  • 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、完整代码

      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
  • 相关阅读:
    小记:xml画一个爱心。
    类似UC天气下拉和微信下拉眼睛头部弹入淡出UI交互效果(开源项目)。
    FloatingActionButton增强版,一个按钮跳出多个按钮--第三方开源--FloatingActionButton
    回调机制的实现。
    小记:使用SharedPreferences存储来设置程序第一次进入欢迎界面,以后不会再进入欢迎界面。
    小记:获取系统时间的long值,格式化成可读时间。
    写程序的欢迎界面(运用画图方法画圆球)。
    并发的HashMap为什么会引起死循环?
    zuul重试配置
    zuul超时问题
  • 原文地址:https://www.cnblogs.com/doodle777/p/MediaPlayer_Usage.html
Copyright © 2011-2022 走看看