Android mediaplayer 播放本地音乐文件

来源:互联网 发布:mac 查找文件路径 编辑:程序博客网 时间:2024/05/14 10:32

上一个博客讲到了搜索本地音乐文件,那么当搜索到后,我们怎么使用这个音乐文件呢?当然是根据路径来播放他,而要播放音乐,自然而然是要用到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的时候,我们需要为他设置数据源,通常有三个,一个是设置路径,一个是设置流

如:

 

这个方法用来设置sdk中的文件

(既得加上读取内存卡的权限)

还有

这个方法是用来设置asset文件夹的,比如程序自带的音乐文件

<textarea style="width: 318px; height: 52px;" <font size="5"> 

根据路径来播放,多为网络播放

(需要网络权限)


当进入初始化状态后,我们所需要的,是进行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()方法。客户端程序员可以通过调用

若当MediaPlayer处于其它(非idie)的状态下,调用setDataSource()方法,会抛出IllegalStateException异常。

MediaPlayer.setOnErrorListener(android.media.MediaPlayer.OnErrorListener)方法来注册一旦发生错误,MediaPlayer对象会进入到Error状态OnErrorListener.,这时候,播放自然而然停止的、


在Android的servicer中,可以看到他的描述“用来操作耗时的工作,如“播放音乐,网络等””,所以,我们应该把它放到server中去实现

对于mediaplayer类的查看,看得出很多都是mative方法,所以c渣渣的我默默结束了这篇博客



1 0