android开发之背景音乐与音效
一:添加背景音乐(MediaPlayer)
MediaPlayer class can be used to control playback of audio/video files and streams.MediaPlayer 类是用来控制音频和视频文件的播放;
实例化MediaPlayer的方法:
-
直接new的方式:MediaPlayer mp = new MediaPlayer();
-
使用create的方式,如:MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了
-
使用直接new的方式创建对象时,设置要播放的文件的方法:MediaPlayer要播放的文件主要包括3个来源:
- 用户在应用中事先自带的resource资源 例如:MediaPlayer.create(this, R.raw.test);
- 存储在SD卡或其他文件路径下的媒体文件 例如:myMediaplayer.setDataSource("/sdcard/test.mp3");
- 网络上的媒体文件 例如:myMediaplayer.setDataSource(http://music.baidu.com/song/490468);
开始播放,停止播放,暂停播放的方法:注意在停止以及暂停播放后要选择一个合适的时间去重新开始也就是调用seekto()方法;
实现监听播放完毕时的方法(这里使用了匿名内部类的方法),可以在播放完毕之后接着播放,也可以停止:
必须释放音频,否则会报错:
二:音效(SoundPool)
SoundPool
The SoundPool class manages and plays audio resources for applications. SoundPool类是Android用于管理和播放应用程序的音频资源的类。一个SoundPool对象可以看作是一个可以从APK中导入资源或者从文件系统中载入文件的样本集合。它利用MediaPlayer服务为音频解码为一个原始16位PCM流。这个特性使得应用程序可以进行流压缩,而无须忍受在播放音频时解压所带来的CPU负载和时延。
SoundPool在载入声音文件过程中,使用了单独的线程,不会对视觉和UI性能产生影响。但SoundPool对载入声音文件大小有所限制
SoundPool与MediaPlayer相比,MediaPlayer存在着资源占用量较高、延迟时间较长、不支持多个音频同时播放等缺点,但SoundPool本身由于内存资源申请有严格限制,所以在开发过程中,建议尽量用SoundPool来播放一些较短的声音片段或者音效。
HashMap :HashMap是基于哈希表的Map接口的非同步实现,HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的功能是通过“键(key)”能够快速的找到“值”。
实例化SoundPool,然后用HashMap来存储 播放的音乐id:(这里定义了一个SoundPool类的数组来存储音频文件)
- soundpool[0].load(this, R.raw.m2, 0)中第一个参数为Context,第2个参数即为资源文件,第3个为音乐的优先级;
- spMap.put(0, soundpool[0].load(this, R.raw.m2, 0))中第一个参数为key值,通过key来找到值,第二参数就是我们要存储的值;
播放音效:
- am为创建声音管理AudioManager对象;
(这里主要是为正在写的2048做背景音乐和音效)实现这些之后,我们的app就可以有背景音乐和按钮音效了;