SoundPool也是Android提供的一种播放音频的方式,但是它与MediaPlayer是不同的。我们来看一下SoundPool与MediaPlayer的不同:
MediaPlayer:
1. MediaPlayer一般用于播放比较大的音频文件。
2. MediaPlayer播放音频文件占用资源较高,延迟的时间较长。
3. MediaPlayer不支持多个音频的播放。
SoundPool:
1. 一般用于播放密集,短促的音频,一般播放提示音。
2. SoundPool可支持播放多个音频文件。
3. 支持自行设置音频的品质0和播放比率。
4. SoundPool播放音频资源占用小,时间延迟小。
SoundPool是使用音效池来管理音频文件的,因此支持多个音频同时播放。我们来看一下SoundPool的使用……
SoundPool
1. 创建SoundPool的对象。
这里需要注意,在API21以前和以后是使用不同的方法来获得SoundPool的对象的,因此我们要进行版本的判断。
API21以前:
直接使用构造器SoundPool(int maxStreams, int streamType, int srcQuality)获得SoundPool的对象。构造器要传入是三个参数,第一个是支持播放的音频的数量;第二个参数是播放的音频的类型;第三个参数是音乐的品质,这个一般默认为0。
API21以后:
通过SoundPool.Builder获得 SoundPool的对象。API以后更改后创建对象变得比较麻烦。
1). 首先获得SoundPool.Builder对象。
2). 通过SoundPool.Builder对象调用setMaxStreams(int maxStreams)方法设置支持播放的音频的数量。
3). 通过SoundPool.Builder对象调用setAudioAttributes(AudioAttributes attributes)方法设置音乐的类型。
这里传入了一个AudioAttributes 的对象,所以我们应该获得AudioAttributes 对象。AudioAttributes对象要通过AudioAttributes.Builder来获得。
AudioAttributes.Builder audioAttributesBuilder = new AudioAttributes.Builder();
audioAttributesBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
AudioAttributes aa = audioAttributesBuilder.build();
4). 通过SoundPool.Builder对象调用build()方法获得SoundPool对象。
2. 导入音频文件。
这里针对不同的资源文件,有不同的加载方式。
load(AssetFileDescriptor afd, int priority)
load(Context context, int resId, int priority)
load(String path, int priority)
load(FileDescriptor fd, long offset, long length, int priority)
使用以上方法加载音频后返回的int型的id,我们用HashMap存储这些id对声音进行管理。
3. 调用play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)方法播放声音。
这里提供了6个参数:soundID是指我们调用load方法后获得的id,通过这个id来选择调用的方法;leftVolume和rightVolume是指左右的音量;priority是指优先级,数值越大,优先级越高,默认为0;loop是指是否循环播放,0为不循环,-1为循环;rate是指声音的播放比率。
我们来看具体的应用……
SoundPool的使用
我们通过点击按钮来播放提示音。
public class MainActivity extends Activity implements View.OnClickListener{
private Button mButtonSoundPool;
private SoundPool pool;
private int id;
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButtonSoundPool= (Button) findViewById(R.id.button_soundpool);
mButtonSoundPool.setOnClickListener(this);
//由于提示音的加载时需要时间的,因此我们将其放在onCreate方法中
int version = Build.VERSION.SDK_INT;
if(version>21){
SoundPool.Builder builder = new SoundPool.Builder();
builder.setMaxStreams(2);
//设置声音的类型
AudioAttributes.Builder audioAttributesBuilder = new AudioAttributes.Builder();
audioAttributesBuilder.setLegacyStreamType(AudioManager.STREAM_MUSIC);
AudioAttributes aa = audioAttributesBuilder.build();
builder.setAudioAttributes(aa);
pool = builder.build();
}else {
//第一个参数是最大声音数,第二个参数是声音的类型,第三个参数是声音的品质。
pool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
}
id = pool.load(getApplicationContext(), R.raw.outgoing, 1);
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.button_soundpool:
pool.play(id, 1, 1, 0, -1, 1);
}
}
}