我的项目是一个简单的应用程序,通过点击ListView中的按钮来再现声音。除了那种方法,一切都很好。
这是班级" Effetti" :
.
.
.
public Effetti(Context context, int resId) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Builder21();
}
else
{
createSoundPoolWithConstructor();
}
am = (AudioManager)
context.getSystemService(Context.AUDIO_SERVICE);
volume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
soundID = sound.load(context, resId, PRIORITY);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
protected void Builder21(){
AudioAttributes attributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.build();
sound = new SoundPool.Builder().setAudioAttributes(attributes).setMaxStreams(1).build();
}
@SuppressWarnings("deprecation")
protected void createSoundPoolWithConstructor(){
sound = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
}
public void playsound() {
sound.play(soundID, volume, volume, 1, 0, 1f);
}
通过这种方式,构造函数应该与所有API目标一起使用。我使用API 21。
在.Wash类中,我使用内部类AsyncTask创建一个包含所需对象的数组。在onResume()方法中我执行任务,在onPause()方法中我可以释放所有资源。
我使用ListView和onItemClick方法。 SoundPool中有32个声音的已知限制,因此我决定在播放后释放每个声音并重新创建它。我这样做是使用Threads.Maybe不是那么干净,但现在它工作,并且UI工作正常。
.
.
.
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterv, final View componente, int pos, long id){
switch(pos){case 0:
sound_one.playsound();
new Thread (new Runnable(){
@Override
public void run(){
try {Thread.sleep(50000);} catch (InterruptedException e) {e.printStackTrace();}
sound_one.release();sound_one=new Effetti(getApplicationContext(),R.raw.boom);
}
}).start();
}
switch(pos){case 1:
sound_two.playsound();
new Thread (new Runnable(){
@Override
public void run(){
try {Thread.sleep(50000);} catch (InterruptedException e) {e.printStackTrace();}
sound_two.release();sound_two=new Effetti(getBaseContext(),R.raw.exp);
}
}).start();
我的问题是声音可以同时播放,我真的不希望它发生!我已将MaxStreams方法设置为1,但它不会起作用。 有什么建议吗?感谢