在Andorid中有三类声音文件,一种是存放在Asset文件夹中的音频文件称为Audio,一种是音效文件(一般为游戏需要,像是击打声之类比较短暂的声音)称为Sound,一种是文件容量比较大的音乐文件,一般是存在手机内存或SD卡中,称之为Music
下面是分类实现
Audio类接口和实现
package com.badlogic.androidgames.framework; public interface Audio { public Music newMusic(String filename); public Sound newSound(String filename); }
package com.badlogic.androidgames.framework.impl; import java.io.IOException; import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.AssetManager; import android.media.AudioManager; import android.media.SoundPool; import com.badlogic.androidgames.framework.Audio; import com.badlogic.androidgames.framework.Music; import com.badlogic.androidgames.framework.Sound; public class AndroidAudio implements Audio { AssetManager assets; SoundPool soundPool; public AndroidAudio(Activity activity) { activity.setVolumeControlStream(AudioManager.STREAM_MUSIC); this.assets = activity.getAssets(); this.soundPool = new SoundPool(20, AudioManager.STREAM_MUSIC, 0); } public Music newMusic(String filename) { try { AssetFileDescriptor assetDescriptor = assets.openFd(filename); return new AndroidMusic(assetDescriptor); } catch (IOException e) { throw new RuntimeException("Couldn't load music '" + filename + "'"); } } public Sound newSound(String filename) { try { AssetFileDescriptor assetDescriptor = assets.openFd(filename); int soundId = soundPool.load(assetDescriptor, 0); return new AndroidSound(soundPool, soundId); } catch (IOException e) { throw new RuntimeException("Couldn't load sound '" + filename + "'"); } } }
package com.badlogic.androidgames.framework; public interface Sound { public void play(float volume); public void dispose(); }
package com.badlogic.androidgames.framework.impl; import android.media.SoundPool; import com.badlogic.androidgames.framework.Sound; public class AndroidSound implements Sound { int soundId; SoundPool soundPool; public AndroidSound(SoundPool soundPool, int soundId) { this.soundId = soundId; this.soundPool = soundPool; } public void play(float volume) { soundPool.play(soundId, volume, volume, 0, 0, 1); } public void dispose() { soundPool.unload(soundId); } }
package com.badlogic.androidgames.framework; public interface Music { public void play(); public void stop(); public void pause(); public void setLooping(boolean looping); public void setVolume(float volume); public boolean isPlaying(); public boolean isStopped(); public boolean isLooping(); public void dispose(); }
package com.badlogic.androidgames.framework.impl; import java.io.IOException; import android.content.res.AssetFileDescriptor; import android.media.MediaPlayer; import android.media.MediaPlayer.OnCompletionListener; import com.badlogic.androidgames.framework.Music; public class AndroidMusic implements Music, OnCompletionListener { MediaPlayer mediaPlayer; boolean isPrepared = false; public AndroidMusic(AssetFileDescriptor assetDescriptor) { mediaPlayer = new MediaPlayer(); try { mediaPlayer.setDataSource(assetDescriptor.getFileDescriptor(), assetDescriptor.getStartOffset(), assetDescriptor.getLength()); mediaPlayer.prepare(); isPrepared = true; mediaPlayer.setOnCompletionListener(this); } catch (Exception e) { throw new RuntimeException("Couldn't load music"); } } public void dispose() { if (mediaPlayer.isPlaying()) mediaPlayer.stop(); mediaPlayer.release(); } public boolean isLooping() { return mediaPlayer.isLooping(); } public boolean isPlaying() { return mediaPlayer.isPlaying(); } public boolean isStopped() { return !isPrepared; } public void pause() { if (mediaPlayer.isPlaying()) mediaPlayer.pause(); } public void play() { if (mediaPlayer.isPlaying()) return; try { synchronized (this) { if (!isPrepared) mediaPlayer.prepare(); mediaPlayer.start(); } } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public void setLooping(boolean isLooping) { mediaPlayer.setLooping(isLooping); } public void setVolume(float volume) { mediaPlayer.setVolume(volume, volume); } public void stop() { mediaPlayer.stop(); synchronized (this) { isPrepared = false; } } public void onCompletion(MediaPlayer player) { synchronized (this) { isPrepared = false; } } }