Android开发手记(14) 使用MediaPlayer播放mp3
2015-10-22 10:28
513 查看
1、获取MediaPlayer实例
(1)可以直接通过new或者create方式:
调用setDataSource和create的区别是,create时已经执行了MediaPlayer.prepare(),而setDataSource需要手动执行。
(2)获取用户事先导入到/res的资源文件
(3)获取存储在SD卡或者其他路径下的文件
(4)获取网络媒体文件
2、播放、暂停
对于通过create调用的媒体,无需在播放时调用prepare方法,而对于通过new创建的媒体,则需要调用一次prepare方法才可完成start的启动。
3、停止播放
当Mediaplayer对象在播放时,可以进行暂停和停止操作,pause方法暂停播放,stop方法停止播放。处于暂停暂停时可通过start方法恢复播放,但是处于停止状态时则必须先调用prepare方法使其处于准备状态,再调用start方法。
4、通过SeekBar控制播放进度
通过MediaPlayer.getDuration()可以得到媒体文件的长度(单位毫秒),可以将此作为SeekBar的最大值。
通过MediaPlayer.seekTo(int i)可以定位媒体文件的任意位置(单位毫秒),mPlayer.seekTo(seekBar.getProgress());
5、将播放时间反馈给SeekBar
由于Android没有提供播放时间反馈方法,所以只能使用定时器或者线程来进行播放反馈。即每隔一定时间来检查播放进度,按照此进度来调节SeekBar。
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、完整代码
MainActivity.java
(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
相关文章推荐
- android 中 任务、进程和线程的区别
- android Uri获取真实路径转换成File的方法
- Android Gradle实用技巧——多渠道打包
- [转]android ANR产生原因和解决办法
- android Titlebar一行代码实现沉浸式效果
- android Titlebar一行代码实现沉浸式效果
- android Titlebar一行代码实现沉浸式效果
- NullPointerException at android.widget.AbsListView.obtainView.
- [bug记录]Android5+运行带有so文件的项目时候找不到so文件异常
- Caused by: java.lang.IllegalArgumentException: Receiver not registered: android.widget.ViewFlipper
- Android----Fragment的基本用法
- Android getWidth和getMeasuredWidth的正解
- Android四大组件应用系列——使用ContentProvider实现跨进程通讯
- Android客户端与PC服务端之间的SOCKET实现登陆功能(服务器)
- Android入门:Handler简介与实例
- Android x86 Emulator Error
- Android4.4之后的外置SD卡文件读写的解决方法
- Android Studio如何快速生成get,set,tostring,构造函数 ,添加实现继承方法
- Android中通过Notification&NotificationManager实现消息通知
- Android_08_用AIDL访问远程服务中的方法