本文实现的简易影音播放器主要实现的功能,包括选取音乐文件,播放、暂停、停止、快进、快退,选取视频文件播放,音乐文件和视频文件都会给出文件名、文件路径的详细信息。主要涉及到MediaPlayer和VideoView的操作、旋转屏幕后重启活动还能继续上一次未完成的播放、还有Activity的生命周期等知识。
一、MediaPlayer播放音乐的流程
1、创建MediaPlayer对象
mper = new MediaPlayer();
2、要播放一首音乐时,必须先设置音乐的Uri并做好准备工作
mper.reset(); //如果之前播放过其他音乐,那么要先reset
mper.setDataSource(this,uri); //指定音乐文件的Uri
mper.prepareAsync(); //准备播放,此时会引发一个“音乐准备好了”事件,稍后介绍
3、当音乐准备好之后,就可以用以下方法播放、暂停或停止播放,还可以设置是否要重复播放
mper.start(); //开始播放
mper.pause(); //暂停播放
mper.stop(); //停止播放
mper.setLooping(true); //设置是否要重复播放(true为要)
注意:执行stop()停止播放后,若要再次播放相同的歌曲,则必须重新执行前面的mper.prepareAsync()准备播放,
而执行pause()暂停后,可以直接用start()继续播放。
4、MediaPlayer会记住当前的播放位置(以秒数为单位),我们可以用程序获取或移动播放位置
int len = mper.getDuration(); //获取音乐的总长度(秒数)
int pos = mper.getCurrentPosition();//获取当前的播放位置(秒数)
mper.seekTo(pos); //移动播放位置到第 pos 秒的位置
5、当不再需要播放时,必须将MediaPlayer对象释放掉
mper.release();
二、MediaPlayer的三个重要事件
1、实现MediaPlayer的三个事件监听接口
public class MainActivity extends Activity implements
MediaPlayer.OnPreparedListener, //音乐准备好 监听事件
MediaPlayer.OnErrorListener, //发生错误时 监听事件
MediaPlayer.OnCompletionListener{} //播放完毕时 监听事件
2、可以使用当前活动对象的this作为事件监听器
mper.setOnPreparedListener(this);
mper.setOnErrorListener(this);
mper.setOnCompletionListener(this);
3、3个监听接口的事件处理方法
public void onPrepared(MediaPlayer mp) {
//音乐准备好时,准备要做的事情。。。
}
public boolean onError(MediaPlayer mp, int what, int extra) {
//发生错误时要处理的事情。。。
return false;
}
public void onCompletion(MediaPlayer mp) {
//播放完毕时要处理的事情。。。
}
三、活动的生命周期
播放音乐时,用户可能会突然切换程序,然后又切换回来。再或者结束程序,这些都要妥善处理。
用户每次切换程序,回到程序,都是在Activity的生命周期内,直到活动结束。几个常用的事件如下所示:
onCreate() //当活动启动时
onResume() //当活动获得输入焦点时
onPause() //当活动失去输入焦点时
onDestory() //当活动结束时
以音乐播放为例,则音乐播放活动的生命周期如下:
(画图的时候少画了一个箭头,手动补上,啊哈哈。。)
当Activity失去输入焦点时就暂停音乐播放,重新获得输入焦点时,一般来说会继续音乐播放,但是直接播放又不合用户使用习惯,因为突然就响了,太吓人。所以最好还是保持暂停,等待用户操作。Activity结束时,要将MediaPlayer对象释放。
当然这个过程涉及到很多事情。例如切换程序的时候,正常的音乐播放器还是会继续播放音乐的,如果用户切换的是文本阅读程序,音乐不会暂停,如果是视频播放程序,音乐就会直接暂停,这里面涉及到很多知识,所以这个简单的播放器就直接切换程序就暂停音乐。手机关闭屏幕进入休眠状态也会失去输入焦点,从而触发onPause()事件,导致音乐暂停,这肯定有解决方案,本程序不打算处理这个问题,而是直接让手机不进入休眠状态,虽然反人类,不管了。在onCreate()中加入以下代码:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
四、使用VideoView搭配MediaController播放视频
1、VideoView可以播放视频文件,但是并没有提供现成的控制菜单,如进度条、控制按钮等。而MediaController可以提供播放时需要的控制组件,搭配VideoView非常合适。关联代码如下:
vdv = (VideoView)findViewById(R.id.videoView); //获取 VideoView 组件
MediaController mediaCtrl = new MediaController(this); //新建播放控制对象
vdv.setMediaController(mediaCtrl); //设置要用播放控制对象来控制播放
注:使用MediaController需要导入android.widget.MediaController
MediaController只是交给用户操作,而在程序中控制播放的还是要使用VideoView提供的方法:
vdv.setVideoURI(uri); //设置要播放视频的Uri
vdv.start(); //开始播放
vdv.pause(); //暂停播放
vdv.stopPlayback(); //停止播放
boolean b = vdv.isPlaying(); //是否在播放中
int len = vdv.getDuration(); //读取视频长度(秒)
int pos = vdv.ge