SoundPool не воспроизводит аудио - PullRequest
0 голосов
/ 15 февраля 2020

Я настроил SoundPool для воспроизведения звука через равные промежутки времени, но он не воспроизводит звук. Я пробовал MediaPlayer, но это в конечном итоге привело к сбою приложения, поэтому я хотел бы знать, является ли способ, которым я делаю это сейчас, даже хорошим способом сделать это? Я все еще использую Media Player для вступительного звука, но он работает нормально. Я очень новичок в Java и Android Studio.

Я планирую сделать выбор программы случайным образом из набора звуков, когда пора играть (вот почему randomWithRange и список других звуки есть), но сейчас я просто пытаюсь заставить звук играть медленно, прежде чем я go продолжу.

public class MainActivity extends AppCompatActivity implements LocationListener {
    private Handler mHandler = new Handler();
    private float nCurrentSpeed = 0;

   private SoundPool soundPool;
   private int fast1, fast2, fast3, fast4, fast5, fast7, fast8, fast9, fast10, thatsastart, therewego, slow1, slow2, slow3, slow4, slow5, slow6, slow7, slow8, slow9, slow10, stops1, stops2, stops3, stops4, stops5, stops6, stops7, stops8, stops9, stops10;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            AudioAttributes audioAttributes = new AudioAttributes.Builder()
                    .setUsage(AudioAttributes.USAGE_ASSISTANCE_SONIFICATION)
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .build();

            soundPool = new SoundPool.Builder()
                    .setMaxStreams(32)
                    .setAudioAttributes(audioAttributes)
                    .build();
        } else {
            soundPool = new SoundPool(32, AudioManager.STREAM_MUSIC, 0);
        }



        fast1 = soundPool.load(this, R.raw.fast1, 1);
        fast2 = soundPool.load(this, R.raw.fast2, 1);
        fast3 = soundPool.load(this, R.raw.fast3, 1);
        fast4 = soundPool.load(this, R.raw.fast4, 1);
        fast5 = soundPool.load(this, R.raw.fast5, 1);
        fast7 = soundPool.load(this, R.raw.fast7, 1);
        fast8 = soundPool.load(this, R.raw.fast8, 1);
        fast9 = soundPool.load(this, R.raw.fast9, 1);
        fast10 = soundPool.load(this, R.raw.fast10, 1);

        thatsastart = soundPool.load(this, R.raw.thatsastart, 1);
        therewego = soundPool.load(this, R.raw.therewego, 1);

        slow1 = soundPool.load(this, R.raw.slow1, 1);
        slow2 = soundPool.load(this, R.raw.slow2, 1);
        slow3 = soundPool.load(this, R.raw.slow3, 1);
        slow4 = soundPool.load(this, R.raw.slow4, 1);
        slow5 = soundPool.load(this, R.raw.slow5, 1);
        slow6 = soundPool.load(this, R.raw.slow6, 1);
        slow7 = soundPool.load(this, R.raw.slow7, 1);
        slow8 = soundPool.load(this, R.raw.slow8, 1);
        slow9 = soundPool.load(this, R.raw.slow9, 1);
        slow10 = soundPool.load(this, R.raw.slow10, 1);

        stops1 = soundPool.load(this, R.raw.stops1, 1);
        stops2 = soundPool.load(this, R.raw.stops2, 1);
        stops3 = soundPool.load(this, R.raw.stops3, 1);
        stops4 = soundPool.load(this, R.raw.stops4, 1);
        stops5 = soundPool.load(this, R.raw.stops5, 1);
        stops6 = soundPool.load(this, R.raw.stops6, 1);
        stops7 = soundPool.load(this, R.raw.stops7, 1);
        stops8 = soundPool.load(this, R.raw.stops8, 1);
        stops9 = soundPool.load(this, R.raw.stops9, 1);
        stops10 = soundPool.load(this, R.raw.stops10, 1);


        final android.media.MediaPlayer introSound = MediaPlayer.create(this, R.raw.intro);
        final android.widget.Button playIntro = (android.widget.Button) this.findViewById(R.id.button3);
        playIntro.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
             //this MediaPlayer is used only when you press a button at the start of the program and it works fine
                introSound.start();
                mHandler.postDelayed(mToastRunnable, 10000);
                playIntro.setVisibility(View.GONE);

            }
        });
    }

    int randomWithRange(int min, int max){
        int range = (max - min) + 1;
        return (int)(Math.random() * range) + min;
    }

    private Runnable mToastRunnable = new Runnable(){
        @Override
        public void run(){

               //the toast shows up at regular intervals like I want it to, but not the sound
               Toast.makeText(MainActivity.this,"should play sound", Toast.LENGTH_SHORT).show();
               soundPool.play(slow1, 1, 1, 0, 0, 1);

            mHandler.postDelayed(this, 3000);
        }
    };

    // I tried with and without OnDestroy
    @Override
    protected void onDestroy(){
        super.onDestroy();
        soundPool.release();
        soundPool = null;
    }
}

Я добавил этот код сразу после всех "soundPool.load" "Чтобы увидеть, загружается ли он вовремя, и тост появляется задолго до того, как должен быть воспроизведен звук, так что кажется, что он загружается вовремя, но тост по какой-то причине не go.

soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
            @Override
            public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
                Toast.makeText(MainActivity.this,"done loading", Toast.LENGTH_SHORT).show();
                //when I try to play a sound from right here, it doesn't work either
            }
        });

Не знаю, стоит ли это упоминать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...