您的位置:首页 > 移动开发 > Android开发

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渣渣的我默默结束了这篇博客


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android