您的位置:首页 > 移动开发 > Android开发

Android开发手记(14) 使用MediaPlayer播放mp3

2015-10-22 10:28 513 查看
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的启动。

    btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
if (mPlayer != null) {
if (mPlayer.isPlaying()) {
mPlayer.pause();
btnStart.setText("播放");
} else {
//                          mPlayer.prepare();
mPlayer.start();
btnStart.setText("暂停");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});


3、停止播放

  当Mediaplayer对象在播放时,可以进行暂停和停止操作,pause方法暂停播放,stop方法停止播放。处于暂停暂停时可通过start方法恢复播放,但是处于停止状态时则必须先调用prepare方法使其处于准备状态,再调用start方法。

  btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
if (mPlayer != null) {
mPlayer.stop();
seekBar.setProgress(mPlayer.getCurrentPosition());
btnStart.setText("播放");
}
} catch (Exception e) {
e.printStackTrace();
}

}
});


4、通过SeekBar控制播放进度

  通过MediaPlayer.getDuration()可以得到媒体文件的长度(单位毫秒),可以将此作为SeekBar的最大值。

  通过MediaPlayer.seekTo(int i)可以定位媒体文件的任意位置(单位毫秒),mPlayer.seekTo(seekBar.getProgress());

seekBar.setMax(mPlayer.getDuration());
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mPlayer.seekTo(seekBar.getProgress());
}
});


5、将播放时间反馈给SeekBar

  由于Android没有提供播放时间反馈方法,所以只能使用定时器或者线程来进行播放反馈。即每隔一定时间来检查播放进度,按照此进度来调节SeekBar。

mTimer = new Timer();
mTimerTask = new TimerTask() {
@Override
public void run() {
seekBar.setProgress(mPlayer.getCurrentPosition());
}
};
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、完整代码

import android.media.MediaPlayer;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.TextView;

import java.util.Timer;
import java.util.TimerTask;

public class MainActivity extends AppCompatActivity {

private Button btnStart;
private Button btnStop;
private TextView textView;
private MediaPlayer mPlayer;
private SeekBar seekBar;
private Timer mTimer;
private TimerTask mTimerTask;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mPlayer = MediaPlayer.create(this, R.raw.leessang);
textView = (TextView) findViewById(R.id.textView);
textView.setText("MP3播放器");
btnStart = (Button) findViewById(R.id.btnStart);
btnStop = (Button) findViewById(R.id.btnStop);
seekBar = (SeekBar) findViewById(R.id.seekBar);

mPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mediaPlayer) {
btnStart.setText("播放");
mPlayer.seekTo(0);
seekBar.setProgress(0);
}
});

mTimer = new Timer();
mTimerTask = new TimerTask() {
@Override
public void run() {
seekBar.setProgress(mPlayer.getCurrentPosition());
}
};
mTimer.schedule(mTimerTask, 0, 10);

seekBar.setMax(mPlayer.getDuration());
seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {

}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {

}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
mPlayer.seekTo(seekBar.getProgress());
}
});

btnStart.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
if (mPlayer != null) {
if (mPlayer.isPlaying()) {
mPlayer.pause();
btnStart.setText("播放");
} else {
//                            mPlayer.prepare();
mPlayer.start();
btnStart.setText("暂停");
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
btnStop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
if (mPlayer != null) {
mPlayer.stop();
seekBar.setProgress(mPlayer.getCurrentPosition());
btnStart.setText("播放");
}
} catch (Exception e) {
e.printStackTrace();
}

}
});

}
}


MainActivity.java
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: