MediaPlayer具体方法介绍:
- void setDataSource(String path) 通过一个具体的路径来设置MediaPlayer的数据源,path可以是本地的一个路径,也可以是一个网络路径
- void setDataSource(Context context, Uri uri) 通过给定的Uri来设置MediaPlayer的数据源,这里的Uri可以是网络路径或是一个ContentProvider的Uri。
- void setDataSource(MediaDataSource dataSource) 通过提供的MediaDataSource来设置数据源
- void setDataSource(FileDescriptor fd) 通过文件描述符FileDescriptor来设置数据源
- int getCurrentPosition() 获取当前播放的位置
- int getAudioSessionId() 返回音频的session ID
- int getDuration() 得到文件的时间
- TrackInfo[] getTrackInfo() 返回一个track信息的数组
- boolean isLooping () 是否循环播放
- boolean isPlaying() 是否正在播放
- void pause () 暂停
- void start () 开始
- void stop () 停止
- void prepare() 同步的方式装载流媒体文件。
- void prepareAsync() 异步的方式装载流媒体文件。
- void reset() 重置MediaPlayer至未初始化状态。
- void release () 回收流媒体资源。
- void seekTo(int msec) 指定播放的位置(以毫秒为单位的时间)
- void setAudioStreamType(int streamtype) 指定流媒体类型
- void setLooping(boolean looping) 设置是否单曲循环
- void setNextMediaPlayer(MediaPlayer next) 当 当前这个MediaPlayer播放完毕后,MediaPlayer next开始播放
- void setWakeMode(Context context, int mode):设置CPU唤醒的状态。
- setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) 网络流媒体的缓冲变化时回调 **
- setOnCompletionListener(MediaPlayer.OnCompletionListener listener) 网络流媒体播放结束时回调
- setOnErrorListener(MediaPlayer.OnErrorListener listener) 发生错误时回调 **
- setOnPreparedListener(MediaPlayer.OnPreparedListener listener):当装载流媒体完毕的时候回调。
使用步骤:
1)获取MediaPlayer实例。
静态方法:
//下面不需要再setDataSource()和prepare();
MediaPlayer mediaPlayer=MediaPlayer.create(this, R.raw.mysoul);//本地资源res.raw/mysoul
动态方法:
MediaPlayer mediaPlayer=new MediaPlayer();
2)设置数据源
//本地资源res.raw/mysoul
mediaPlayer.setDataSource(this, Uri.parse("android.resource://com.example.k555l.test/" + R.raw.mysoul));
//网络资源,不要忘记添加网络访问权限
// <uses-permission android:name="android.permission.INTERNET"/>
//mediaPlayer.setDataSource("http://www.xxxx.com/yyyy.mp3");
//本地存储资源,外部资源访问权限
// <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
// <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
//mediaPlayer.setDataSource("/sdcard/leesang.mp3");
//指定流媒体类型
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
3)装载资源
mediaPlayer.prepare();//同步加载资源。
//异步加载资源,需要监听是否加载完成,才可以播放,当资源文件较大或者网络资源的时候使用。
mediaPlayer.prepareAsync();
4)播放
mediaPlayer.start();
5)回收资源
mediaPlayer.release();
mediaPlayer = null;
MediaPlayer和SeekBar控制、显示进度的简单例子:
/*** * 初始化 */ void initMediaPlayer() { mediaPlayer = new MediaPlayer();//创建实例 try { mediaPlayer.setDataSource(this, Uri.parse("android.resource://com.example.k555l.test/" + R.raw.mysoul));//设置数据源 mediaPlayer.prepareAsync();//异步加载资源,需要监听是否加载完成,才可以播放 } catch (IOException e) { e.printStackTrace(); } mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);//设置播放类型 mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {//异步装载监听 @Override public void onPrepared(MediaPlayer mediaPlayer) { //加载完成后,让按钮变为可点击状态 btn_play.setEnabled(true); } }); mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer me) { // 在播放完毕被回调 //Toast.makeText(MainActivity.this, "播放完了", Toast.LENGTH_SHORT).show(); } }); }
/*** * 进度条 */ @SuppressLint("HandlerLeak") void initSeekbar() { seekBar.setMax(100);//最大进度值 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { // 该方法拖动进度条进度改变的时候调用 @Override public void onProgressChanged(SeekBar seekBar, int i, boolean fromuser) { } //该方法拖动进度条开始拖动的时候调用。 @Override public void onStartTrackingTouch(SeekBar seekBar) { } // 该方法拖动进度条停止拖动的时候调用 @Override public void onStopTrackingTouch(SeekBar seekBar) { mediaPlayer.seekTo(seekBar.getProgress() * mediaPlayer.getDuration() / 100); } }); //控制音量,有需要,自行添加设置 // AudioManager audioManager=(AudioManager) getSystemService(AUDIO_SERVICE); // audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,10,AudioManager.FLAG_SHOW_UI); handler = new Handler() { @Override public void dispatchMessage(Message msg) { if (msg.what == 1 && mediaPlayer != null) //进度条更新进度 seekBar.setProgress(mediaPlayer.getCurrentPosition() * 100 / mediaPlayer.getDuration());// 当前/总数*100 } };
@Override public void onClick(View view) {//按钮的点击事件处理 switch (view.getId()) { case R.id.btn_play: if (mediaPlayer != null && !mediaPlayer.isPlaying()) mediaPlayer.start(); break; case R.id.btn_pause: if (mediaPlayer != null && mediaPlayer.isPlaying()) mediaPlayer.pause(); break; case R.id.btn_stop: if (mediaPlayer != null && mediaPlayer.isPlaying()) //mediaPlayer.stop(); stop(); break; default: break; } }
// 在停止播放的是代码应这样写才可以在下次播放时重新开始播放, //如果不需要可直接mediaPlayer.stop(); private void stop() { if (mediaPlayer != null) {//mediaplayer 是MediaPlayer的 instance mediaPlayer.stop(); // mediaPlayer.prepare(); mediaPlayer.prepareAsync();//stop后下次重新播放要首先进入prepared状态 mediaPlayer.seekTo(0);//须将播放时间设置到0;这样才能在下次播放是重新开始,否则会继续上次播放 } }
另外MediaPlayer操作的是流媒体,有可能中间一段因为解析或者源文件错误等问题,造成中间一段无法播放问题,这时候要为MediaPlayer注册回调函数setOnErrorListener()来设置出错之后的解决办法,一般重新播放或者播放下一个流媒体。