播放音乐涉及MediaPlayer类,下面将重点讲解MediaPlayer这一个类的常见操作。
(1)如何获得MediaPlayer实例
1)可以直接使用new的方式,如:
2)可以使用create的方式,如:
(2)如何设置要播放的文件
MediaPlayer要播放的文件主要包括3个来源:
1)用户在开发过程中,使用事先自带的resource资源,例如:MediaPlayer.create(this,R.raw.test);
2)存储在SD卡或其他文件路径下的媒体文件,例如:mediaPlayer.setDataSource("/sdcard/test.mp3");
3)网络上的媒体文件,例如:mediaPlayer.setDataSource("http://www.citynorth.cn/music/confucius.mp3");
MediaPlayer的setDataSource一共给出了四个方法:
(3)对播放器的主要控制方法
Android是通过控制播放器的播放状态来控制媒体文件的播放,其中:prepare()和prepareAsync()提供了同步和异步两种方式设置播放器进入资源准备状态。需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare(),因为在create()方法中已经调用过。播放器的主要控制方法总结如表13-3所示。
表13-3 播放器的主要控制方法
(4)设置播放器的监听方法
MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以实现及时处理各种播放情况。例如,提供了setOnCompletionListener(MediaPlayer.On CompletionListener listener)方法对播放结束进行监听,一般在播放音频文件结束时调用,在方法中通常加release()方法释放音频资源;提供了setOnErrorListener(MediaPlayer.On ErrorListener listener)方法,设置播放出错时的监听方法。
(5)MediaPlayer的生命周期
MediaPlayer的生命周期如图13-21所示。
这张状态转换图清晰地描述了MediaPlayer的各个状态,也列举了主要方法的调用先后过程,每种方法只能在一些特定的状态下使用,如果使用状态不正确则会引发IllegalStateException异常。
1)Idle状态:当使用new()方法创建一个MediaPlayer对象或者调用其reset()方法时,该MediaPlayer对象处于idle状态。这两种方法的一个重要差别就是:如果在这个状态下调用了getDuration()等方法(相当于调用时机不正确)则会通过reset()方法进入idle状态,接着会触发OnErrorListener.onError()方法,使MediaPlayer进入Error状态;如果是新创建的MediaPlayer对象,则并不会触发onError(),也不会进入Error状态。
2)End状态:通过release()方法可以进入End状态,只要MediaPlayer对象不再被使用,就应当通过release()方法释放相关的软硬件组件资源。如果MediaPlayer对象进入了End状态,则不会在进入任何其他状态。
3)Initialized状态:MediaPlayer调用setDataSource()方法时就进入Initialized状态,表示此时要播放的文件已经设置好。
4)Prepared状态:初始化完成之后还需要通过调用prepare()或prepareAsync()方法,这两个方法是同步和异步的区别。只有进入Prepared状态,才表明MediaPlayer到目前为止都没有错误,可以进行文件播放。
5)Preparing状态:这个状态通常是和prepareAsync()配合使用,如果异步准备完成,则会触发OnPreparedListener.onPrepared(),进而进入Prepared状态。(www.xing528.com)
图13-21 MediaPlayer的生命周期
6)Started状态:MediaPlayer一旦准备好,就可以调用start()方法,进而MediaPlayer就处于Started状态,这表明MediaPlayer正在播放文件过程中。可以使用isPlaying()测试MediaPlayer是否处于了Started状态。如果播放完毕,而又设置了循环播放,则MediaPlayer仍然会处于Started状态。类似,如果在该状态下MediaPlayer调用了seekTo()或者start()方法均可以让MediaPlayer停留在Started状态。
7)Paused状态:Started状态下MediaPlayer调用pause()方法可以暂停MediaPlayer,从而进入Paused状态,该状态可以调用seekTo()方法。MediaPlayer暂停后再次调用start()则可以继续进行播放,从而转到Started状态。
8)Stop状态:Started或者Paused状态下均可调用stop()停止MediaPlayer,而处于Stop状态的MediaPlayer要想重新播放,需要通过prepareAsync()和prepare()重新回到先前的Prepared状态。
9)PlaybackCompleted状态:文件正常播放完毕,而又没有设置循环播放就会进入该状态,并会触发OnCompletionListener的onCompletion()方法。此时可以调用start()方法重新播放文件,也可以通过stop()方法停止MediaPlayer,还可以通过seekTo()来重新定位播放的位置。
10)Error状态:如果由于某种原因MediaPlayer出现了错误,会触发OnErrorListener.onError()事件,此时MediaPlayer就进入Error状态。及时捕捉并妥善处理这些错误是很重要的,可以帮助我们及时释放相关的软硬件资源,也可以改善用户体验。通过setOnErrorListener(android.media.MediaPlayer.OnErrorListener)可以设置该监听器。如果MediaPlayer进入了Error状态,可以通过调用reset()来恢复,使得MediaPlayer重新返回到Idle状态。
下面通过一个示例,讲述播放音频的使用方法。如要在模拟器中演示播放音乐的效果,需要在DDMS模拟器的sdcard存入音频文件,具体步骤如下:
1)运行模拟器,打开DDMS,在FileExplorer找到mnt文件夹下的sdcard文件夹,如图13-22所示。
2)单击右上角,导入音频文件,如图13-23所示。
图13-22 模拟器DDMS中sdcard的位置
图13-23 在模拟器中sdcard中导入文件
这样,运行示例代码就可以在模拟器上播放音频文件了。示例代码运行结果如图13-24所示。
首先,介绍如何通过xml布局实现界面效果,如代码清单13-16所示。
代码清单13-16 播放音频示例(第13章\Demo_13_05)main.xml
图13-24 播放音频示例
其次,介绍Activity java代码如何配合布局实现播放音频功能,如代码清单13-17所示。
代码清单13-17 播放音频示例(第13章\Demo_13_05)MainActivity.java
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。