声音的播放有两种方式,且分别适用于不同的情况。
首先介绍使用MediaPlayer类来播放声音的方法,步骤如下所示。
1)创建名为Android_Sample_2_3的Android项目。
2)将声音资源sound.mid存放到Android_Sample_2_3/res/raw目录下,如果raw文件夹不存在,直接创建一个即可。
3)打开Andorid_Sample_2_3/src/wyf/ytl目录下的Andorid_SAmple_2_3Activity.java文件,将其代码替换成如下代码。
1: package wyf.ytl;
2:3: import android.app.Activity;
4: import android.media.MediaPlayer;
5: import android.os.Bundle;
6:7: public class Android_Sample_2_3Activity extends Activity {8: MediaPlayer mMediaPlayer; // 声音
9:10: public void onCreate(Bundle savedInstanceState) {11: super.onCreate(savedInstanceState);
12: mMediaPlayer = MediaPlayer.create(this, R.raw.sound);// 得到声音资源13: setContentView(R.layout.main);// 设置当前显示的布局
14: mMediaPlayer.start();// 播放声音
15: }16: }
第9行声明声音资源的引用。
第15行则创建声音资源,将raw文件夹下的sound声音资源加载到内存。
第17行调用start方法播放声音。
4)运行该项目,如果听到悦耳的声音,则表明运行成功。
接下来介绍游戏中短促声音播放时经常使用的解决方案SoundPool类,虽然该类的使用方法较为复杂,但播放的声音往往更加精准。该案例的开发步骤如下所示。
1)创建一个名为Android_Sample_2_4的Android项目。
2)将声音资源sound.ogg存放到Sample_2_4/res/raw目录下。
3)打开Android_Sample_2_4Activity.java文件,用下列代码替换原有的代码。
第14~15行声明SoundPool的引用,然后声明声音管理容器soundPoolMap。1: package wyf.ytl;
2:3: import java.util.HashMap;
4:5: import android.app.Activity;
6: import android.content.Context;
7: import android.media.AudioManager;
8: import android.media.SoundPool;
9: import android.media.SoundPool.OnLoadCompleteListener;
10: import android.os.Bundle;
11: import android.util.Log;
12:13: public class Android_Sample_2_4Activity extends Activity {14: SoundPool soundPool; // SoundPool对象引用
15: HashMap<Integer, Integer> soundPoolMap;// 声音的管理容器
16: boolean SOUND_PLAY = false;17:18: @Override19: public void onCreate(Bundle savedInstanceState) {20: super.onCreate(savedInstanceState);
21: initSounds();// 初始化声音资源
22: setContentView(R.layout.main);23: }24:25: public void initSounds() {26: soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
27: soundPoolMap = new HashMap<Integer, Integer>();
28:29: soundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
30: @Override31: public void onLoadComplete(SoundPool soundPool, int sampleId,32: int status) {
33: if (status != 0) {
34: Log.e("SOUND LOAD", " Sound ID: " + sampleId35: + " Failed to load.");
36: } else {
37: Log.i("SOUND LOAD", " Sound ID: " + sampleId + " loaded.");38: playSound(1, 5); // 播放5次
39: }40: }41:42: });43:44: soundPoolMap.put(1, soundPool.load(this, R.raw.sound, 1));// 加载声音45: }46:47: public void playSound(int sound, int loop)// 播放声音的方法48: {49: AudioManager mgr = (AudioManager) this
50: .getSystemService(Context.AUDIO_SERVICE);51:52: float streamVolumeCurrent = mgr
53: .getStreamVolume(AudioManager.STREAM_MUSIC);54: float streamVolumeMax = mgr
55: .getStreamMaxVolume(AudioManager.STREAM_MUSIC);56: float volume = streamVolumeCurrent / streamVolumeMax;// 得到音量的大小57:58: soundPool.play(soundPoolMap.get(sound), volume, volume, 1, loop, 1f);59: }60: }
第19~22行为重写的onCreate方法,其中第21行调用声音初始化方法进行声音的初始化。
第25~44行为声音的初始化方法,其中先初始化soundPool与soundPoolMap,设置一个监听器,让声音文件在加载成功后循环播放5次,然后加载声音并将引用添加到soundPoolMap中方便管理。
第47~58行为声音的播放方法,首先得到音量管理器,然后设置音量,最后在第58行调用Play方法对指定的声音进行播放。
作者:银月莲
出处:http://www.cnblogs.com/moonsilvering
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,包括文章,代码,图片等本站内所有资源,否则保留追究法律责任的权利。