前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android应用的必要功能——音频的播放

Android应用的必要功能——音频的播放

作者头像
博文视点Broadview
发布2020-06-11 10:57:19
1.8K0
发布2020-06-11 10:57:19
举报

Android应用面向的是普通个人用户,这些用户往往会更加关注用户体验,因此为Android应用增加动画、视频、音乐等多媒体功能十分必要。就目前的手机发展趋势来看,手机已经不再是单一的通信工具,已经发展成集照相机、音乐播放器、视频播放器、个人小型终端于一体的智能设备,因此为手机提供音频录制、播放,视频录制、播放的功能十分重要。

Android提供了常见音频、视频的编码、解码机制,就像之前所用过的MediaPlayer类,Android支持的音频格式有MP3、WAV和3GP等,支持的视频格式有MP4和3GP等。

借助于这些多媒体支持类,我们可以非常方便地在手机应用中播放音频、视频等,这些多媒体数据既可是来自于Android应用的资源文件,也可是来自于外部存储器上的文件,甚至可以是来自于网络的文件流。不仅如此,Android也提供了对摄像头、麦克风的支持,因此也可以十分方便地从外部采集照片、视频、音频等多媒体信息。

使用MediaPlayer播放音频

使用MediaPlayer播放音频十分简单,当程序控制MediaPlayer对象装载音频完成之后,程序可以调用MediaPlayer的如下三个方法进行播放控制。

start():开始或恢复播放。 stop():停止播放。 pause():暂停播放。

为了让MediaPlayer来装载指定音频文件,MediaPlayer提供了如下简单的静态方法。

staticMediaPlayer create(Context context, Uri uri):从指定Uri来装载音频文件,并返回新创建的MediaPlayer对象。 staticMediaPlayer create(Context context, int resid):从resid资源ID对应的资源文件中装载音频文件,并返回新创建的MediaPlayer对象。

上面两个方法用起来非常方便,但这两个方法每次都会返回新创建的MediaPlayer对象,如果程序需要使用MediaPlayer循环播放多个音频文件,使用 MediaPlayer的静态create()方法就不太合适了,此时可通过MediaPlayer的setDataSource()方法来装载指定的音频文件。MediaPlayer提供了如下方法来指定装载相应的音频文件。

setDataSource(Stringpath):指定装载path路径所代表的文件。 setDataSource(FileDescriptorfd, long offset, long length):指定装载fd所代表的文件中从offset开始、长度为length的文件内容。 setDataSource(FileDescriptorfd):指定装载fd所代表的文件。 setDataSource(Contextcontext, Uri uri):指定装载uri所代表的文件。

执行上面所示的setDataSource()方法之后,MediaPlayer并未真正去装载那些音频文件,还需要调用MediaPlayer的prepare()方法去准备音频,所谓“准备”,就是让MediaPlayer真正去装载音频文件。

因此使用已有的MediaPlayer对象装载“下一首”歌曲的代码模板为:

除此之外,MediaPlayer还提供了一些绑定事件监听器的方法,用于监听MediaPlayer播放过程中所发生的特定事件。绑定事件监听器的方法如下。

setOnCompletionListener(MediaPlayer.OnCompletionListenerlistener):为MediaPlayer的播放完成事件绑定事件监听器。 setOnErrorListener(MediaPlayer.OnErrorListenerlistener):为MediaPlayer的播放错误事件绑定事件监听器。 setOnPreparedListener(MediaPlayer.OnPreparedListenerlistener):当MediaPlayer调用prepare()方法时触发该监听器。 setOnSeekCompleteListener(MediaPlayer.OnSeekCompleteListenerlistener):当MediaPlayer调用seek()方法时触发该监听器。

因此可以在创建一个MediaPlayer对象之后,通过为该MediaPlayer绑定监听器来监听相应的事件。例如如下代码:

下面简单归纳一下使用MediaPlayer播放不同来源的音频文件。

1.播放应用的资源文件

播放应用的资源文件需要两步即可。

(1)调用MediaPlayer的create(Context context, intresid)方法装载指定的资源文件。 (2)调用MediaPlayer的start()、pause()、stop()等方法控制播放即可。

例如如下代码:

提示:音频资源文件一般放在Android应用的/res/raw目录下。

2.播放应用的原始资源文件

播放应用的资源文件按如下步骤执行。

(1)调用Context的getAssets()方法获取应用的AssetManager。 (2)调用AssetManager对象的openFd(String name)方法打开指定的原始资源,该方法返回一个AssetFileDescriptor对象。 (3)调用AssetFileDescriptor的getFileDescriptor()、getStartOffset()和getLength()方法来获取音频文件的FileDescriptor、开始位置、长度等。 (4)创建MediaPlayer对象(或利用已有的MediaPlayer对象),并调用MediaPlayer对象的setDataSource(FileDescriptorfd, long offset, long length)方法来装载音频资源。 (5)调用MediaPlayer对象的prepare()方法准备音频。 (6)调用MediaPlayer的start()、pause()、stop()等方法控制播放即可。

注意:虽然MediaPlayer提供了setDataSource(FileDescriptor fd)方法来装载指定的音频资源,但实际使用时这个方法似乎有问题:不管程序调用openFd(String name)方法时指定打开哪个原始资源,MediaPlayer将总是播放第一个原始音频资源。

例如如下代码片段:

3.播放外部存储器上的音频文件

播放外部存储器上的音频文件按如下步骤执行。

(1)创建MediaPlayer对象(或利用已有的MediaPlayer对象),并调用MediaPlayer对象的setDateSource(String path)方法装载指定的音频文件。 (2)调用MediaPlayer对象的prepare()方法准备音频。 (3)调用MediaPlayer的start()、pause()、stop()等方法控制播放即可。

例如如下代码:

4.播放来自网络的音频文件

播放来自网络的音频文件有两种方式:①直接使用MediaPlayer的静态create(Context context, Uriuri)方法;②调用MediaPlayer的setDataSource(Contextcontext, Uri uri)方法装载指定Uri对应的音频文件。

以第二种方式播放来自网络的音频文件的步骤如下。

(1)根据网络上的音频文件所在的位置创建Uri对象。 (2)创建MediaPlayer对象(或利用已有的MediaPlayer对象),并调用MediaPlayer对象的setDateSource(Context context,Uri uri)方法装载Uri对应的音频文件。 (3)调用MediaPlayer对象的prepare()方法准备音频。 (4)调用MediaPlayer的start()、pause()、stop()等方法控制播放即可。

例如如下代码片段:

MediaPlayer除了调用prepare()方法来准备声音之外,还可以调用prepareAsync()来准备声音。prepareAsync()与普通prepare()方法的区别在于,prepareAsync()是异步的,它不会阻塞当前的UI线程。

归纳起来,MediaPlayer的状态图如下图所示。

本文摘自《疯狂Android讲义(第3版)》

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-06-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 博文视点Broadview 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档