Android mediaplayer 播放本地音乐文件
2016-09-08 10:43
585 查看
上一个博客讲到了搜索本地音乐文件,那么当搜索到后,我们怎么使用这个音乐文件呢?当然是根据路径来播放他,而要播放音乐,自然而然是要用到Android的mediaplayer这个类。
对于mediaplayer,大家应该都有些了解,所以就不累赘了,下面就讲下他的流程
上面是mediaplayer的状态图,看得出mediaplayer有两个极端的生命周期:idie还有end,当一个MediaPlayer对象被刚刚用new操作符创建或是调用了reset()方法后,它就处于Idle状态。当调用了release()方法后,它就处于End状态。这两种状态之间是MediaPlayer对象的生命周期。
实例化一个mediaplayer的方法有两种,分别是:
可以使用直接new的方式:
MediaPlayer mp = new MediaPlayer();
也可以使用create的方式,如:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了
1.以new一个mediaplayer为例,当new了一个mediaplayer的时候,我们需要为他设置数据源,通常有三个,一个是设置路径,一个是设置流
如:
public void setDataSource(String path)<br/>
throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {<br/>
setDataSource(path, null, null);<br/>
}
这个方法用来设置sdk中的文件
(既得加上读取内存卡的权限)
还有:public void setDataSource(FileDescriptor fd)<br/>
throws IOException, IllegalArgumentException, IllegalStateException {<br/>
// intentionally less than LONG_MAX<br/>
setDataSource(fd, 0, 0x7ffffffffffffffL);<br/>
}<br/>
这个方法是用来设置asset文件夹的,比如程序自带的音乐文件
<textarea style="width: 318px; height: 52px;" <font size="5"> public void setDataSource(Context context, Uri uri)<br/>
throws IOException, IllegalArgumentException, SecurityException, IllegalStateException {<br/>
setDataSource(context, uri, null);<br/>
}</font>
根据路径来播放,多为网络播放
(需要网络权限)
当进入初始化状态后,我们所需要的,是进行prepare状态,如果不进行prepare状态,调用start方法是无法响应的,这是因为在prepare状态的时候,会进行开线程的
操作,而播放音乐又是一个耗内存的行为,所以需要开一个线程。有两种方法(同步和异步)可以使MediaPlayer对象进入Prepared状态:要么调用prepare()方法(同步),此方法返回就表示该MediaPlayer对象已经进入了Prepared状态;要么调用prepareAsync()方法(异步),此方法会使此MediaPlayer对象进入Preparing状态并返回,而内部的播放引擎会继续未完成的准备工作。从图解看出来,在从初始化到prepare状态,基本都是调用前者,因为没有未完成的准备工作
在这时候,我们就可以调用onstart方法来播放我们的音乐了,在播放的时候,我们可以设置他的各个参数,如,是否循环,而他的循环,就是我们音乐播放的“单曲循环”了,
好,在onstart方法中,可以切换到两种状态,一个是onstop状态,一个是onpause状态。
onpause:顾名思义,就是暂停,如果要继续播放,需要重新调用onstart方法
onstop:就是停止,需要重新回到prepare状态才可以播放,这时候,有两个方法可以调用,详情请看prepare那儿,这也就是为什么有的播放器停止后从新开启,可以停留在上回播放的seek中
细心的朋友应该看到了,有一个onseek方法,他的作用是使得mediaplayer播放的“时刻”改变,而且在onstart还有onpause都是通用的
当程序关闭,或则停止播放时,我们应该release一下,释放下,
最后,提一下mediaplayer的exception,在一般情况下,由于种种原因一些播放控制操作可能会失败,如不支持的音频/视频格式,缺少隔行扫描的音频/视频,分辨率太高,流超时等原因,等等。因此,错误报告和恢复在这种情况下是非常重要的。有时,由于编程错误,在处于无效状态的情况下调用了一个播放控制操作可能发生。在所有这些错误条件下,内部的播放引擎会调用一个由客户端程序员提供的OnErrorListener.onError()方法。客户端程序员可以通过调用
若当[b]MediaPlayer处于其它(非idie)的状态下,调用setDataSource()方法,会抛出IllegalStateException异常。
[/b]
MediaPlayer.setOnErrorListener(android.media.MediaPlayer.OnErrorListener)方法来注册一旦发生错误,[b]MediaPlayer对象会进入到Error状态OnErrorListener.[/b],这时候,播放自然而然停止的、
在Android的servicer中,可以看到他的描述“用来操作耗时的工作,如“播放音乐,网络等””,所以,我们应该把它放到server中去实现
对于mediaplayer类的查看,看得出很多都是mative方法,所以c渣渣的我默默结束了这篇博客
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories