我封装了一个简单的提示音播放控件
代码:
import android.content.Context;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.SoundPool;
/**
* 播放简短的提示音
* 使用时注意的问题:加载资源需要时间,所以要先预加载再使用。
* 先在初始化生命周期onCreate()时调用setSoundID();然后在播放时调用play()
* 否则,会听不到声音!
* <p>
* 参考示例:
* <p>
* Sound sound;
* <p>
* onCreate()中
* onCreate(Bundle savedInstanceState){
* super.onCreate(savedInstanceState);
* <p>
* sound = new Sound(this).build();
* sound.setSoundResource(R.raw.pop);
* }
* <p>
* onClick()中
* button.setOnClickListener(v -> {
* sound.play();
* });
*/
public class Sound {
SoundPool.Builder builder;
SoundPool soundPool;
int soundID;
Context mContext;
public Sound(Context mContext) {
this.mContext = mContext;
}
public Sound build() {
if (builder == null) {
builder = new SoundPool.Builder();
//传入最多播放音频数量,
builder.setMaxStreams(1);
//AudioAttributes是一个封装音频各种属性的方法
AudioAttributes.Builder attrBuilder = new AudioAttributes.Builder();
//设置音频流的合适的属性
attrBuilder.setLegacyStreamType(AudioManager.STREAM_ALARM);
//加载一个AudioAttributes
builder.setAudioAttributes(attrBuilder.build());
soundPool = builder.build();
}
return this;
}
public void setSoundResource(int soundID) {
if (soundPool == null) throw new RuntimeException("请先调用build()方法");
this.soundID = soundPool.load(mContext, soundID, 1);
}
public Sound play() {
if (soundID == 0) throw new RuntimeException("请先调用setSoundID()方法");
if (soundPool != null) {
soundPool.play(soundID, 0.2f, 0.2f, 1, 0, 1);
}
return this;
}
public Sound release() {
if (soundPool != null) {
soundPool.release();
}
return this;
}
public Sound stop() {
if (soundPool != null) {
soundPool.stop(soundID);
}
return this;
}
public Sound setOnLoadCompleteListener(SoundPool.OnLoadCompleteListener onLoadCompleteListener) {
soundPool.setOnLoadCompleteListener(onLoadCompleteListener);
return this;
}
}