Soundpool играть несколько раз на андроид

У меня проблема с воспроизведением Soundpool . Я новичок в образовании в Android, и я надеюсь, что вы мне поможете. Я создал класс для загрузки Soundpool

 public class Suond {


    protected  static int suond1 ,suond2,suond3,suond4,suond5,suond6,suond7;
    protected  static  SoundPool sou;
    protected  static  AudioAttributes aa;


    @SuppressLint("NewApi") 
    @SuppressWarnings("deprecation")

    protected static void oi(Context Con ){


         if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){

             aa = new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_GAME)
            .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
            .build();

 sou = new SoundPool.Builder().setMaxStreams(10)
.setAudioAttributes(aa).build();

                  suond1 = sou.load(Con,R.raw.Music1,1);
                  suond2 = sou.load(Con,R.raw.Music2,1);
                  suond3 = sou.load(Con,R.raw.Music3,1);
                  suond4 = sou.load(Con,R.raw.Music4,1);
                  suond5 = sou.load(Con,R.raw.Music5,1);
                  suond6 = sou.load(Con,R.raw.Music6,1);
                  suond7 = sou.load(Con,R.raw.Music7,1);
                           }

             else{ sou = new SoundPool(10,AudioManager.STREAM_MUSIC,1);

                  suond1 = sou.load(Con,R.raw.Music1,1);
                  suond2 = sou.load(Con,R.raw.Music2,1);
                  suond3 = sou.load(Con,R.raw.Music3,1);
                  suond4 = sou.load(Con,R.raw.Music4,1);
                  suond5 = sou.load(Con,R.raw.Music5,1);
                  suond6 = sou.load(Con,R.raw.Music6,1);
                  suond7 = sou.load(Con,R.raw.Music7,1);

                 }  

                }               

    }

У меня также есть 10 кнопок, представляющих уровни в игре. В каждой кнопке текстовое представление Содержит значение, используемое с анимированным слушателем для каждого текстового представления. В конце слушателя используйте soundpool .

valueAnimator.addListener(new Animator.AnimatorListener() {
      @Override
      public void onAnimationStart(Animator animation) {


        suond.sou.play(Suond.suond1, 1, 1, 1, 0, 1);

      }

      @Override
      public void onAnimationEnd(Animator animation) {


          Suond.sou.play(Suond.suond2, 1, 1, 1, 0, 1);






      }

      @Override
      public void onAnimationCancel(Animator animation) {

      }

      @Override
      public void onAnimationRepeat(Animator animation) {

      }
    });

 valueAnimator.setDuration(2000);
 valueAnimator.start();
 }

Каждая кнопка имеет слушателя, соединенного друг с другом, где, когда слушатель нажимает первую кнопку, анимация начинается со второй и третьей кнопки до десятой кнопки соответственно. Все идет хорошо, но когда анимация достигает восьмой кнопки, а иногда и девятой или десятой, звук исчезает до тех пор, пока активность не уйдет, и два или три раза вернется к звуковой активности для воспроизведения. Я думаю, что звук остановился из-за воспроизведения несколько раз подряд, но когда я читаю о Soundpool, он предназначен для воспроизведения коротких звуков и может воспроизводить больше, чем звук одновременно, может воспроизводить до 16 звуков одновременно в моем Звуки приложения не воспроизводятся одновременно, но соответственно и то, что используемые им звуки не превышали 30 КБ. Я не знаю, что не так. Почему звук перестает играть, когда вы играете его несколько раз подряд. Я использую Android 4.0 Большое спасибо и надеюсь помочь мне с любыми решениями.

1 ответ

(1) В вашем коде есть опечатки, так как вы собрали его?

Suond.sou.play(Suond.suond2, 1, 1, 1, 0, 1);
suond.sou.play(Suond.suond1, 1, 1, 1, 0, 1);

в любом случае это должно быть:

Suond.sou.play(Suond.suond2, 1, 1, 1, 0, 1);

(2) MaxStreams установлен на 10, поэтому вы можете иметь только 10 одновременных потоков (не 16):

sou = new SoundPool.Builder().setMaxStreams(10).setAudioAttributes(aa).build();
else{ sou = new SoundPool(10,AudioManager.STREAM_MUSIC,1);

(3) отслеживать ваши активные звуки (Suond.sou.play возвращает целое число):

int streamID = Suond.sou.play(Suond.suond2, 1, 1, 1, 0, 1);//streamID better as an integer array

(4) Не забудьте привести себя в порядок после того, как вы покинете упражнение (если вы не собираетесь использовать его после завершения занятия, отпустите в onDestroy().):

//loop round your active sounds
sou .stop(streamID) ;stop ONE active sound
sou .release();
Другие вопросы по тегам