Подтвердить что ты не робот

Правильный способ воспроизведения коротких звуков Android?

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

Код, который я использую для воспроизведения своего звука, таков:

    Button sound1;
MediaPlayer  firstSound;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    firstSound = MediaPlayer.create(SoundActivity.this, R.raw.click);


    sound1 = (Button) findViewById(R.id.Sound1);


    beaver.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {

            firstSound.start();

            }

    });



    }

Моя проблема с задержкой также может быть связана с тем, как я использую объект медиаплеера? Я чувствую, что это должно быть более гладко на моем телефоне, любые предложения о том, как играть звуки в Android, ценятся.

Спасибо.

С момента обнаружения Sound Pool я редактировал свой код, чтобы использовать его, и он отлично работает, новый код выглядит так:

SoundPool soundPool;
HashMap<Integer, Integer> soundPoolMap;
int soundID = 1;


Button sound1;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);


    soundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
    soundPoolMap = new HashMap<Integer, Integer>();
    soundPoolMap.put(soundID, soundPool.load(this, R.raw.click, 1));

    sound1 = (Button) findViewById(R.id.bBeaver);


    sound1.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {

                    AudioManager audioManager = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
              float curVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
              float maxVolume = audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
              float leftVolume = curVolume/maxVolume;
              float rightVolume = curVolume/maxVolume;
              int priority = 1;
              int no_loop = 0;
              float normal_playback_rate = 1f;
              soundPool.play(soundID, leftVolume, rightVolume, priority, no_loop, normal_playback_rate);

            }

    });


    }

Спасибо

4b9b3361

Ответ 1

Вы можете использовать SoundPool. Это соответствует тому, что вы хотите сделать отлично.

Вам просто нужно будет сохранить идентификаторы звукового эффекта, соответствующие каждому изображению (или кнопке).

Возможно, продолжите кнопку Button, чтобы сохранить соответствующий идентификатор звукового эффекта. И используйте обычный SoundPool для воспроизведения звукового эффекта, связанного с идентификатором при нажатии кнопки.

Здесь вы можете узнать больше о SoundPool.

Ответ 2

@Rikonator находится на правильном пути там, где есть Soundpool. Это намного больше подходит для тех функций, которые вы используете.

Если вы решите пойти с медиаплеер в любом случае, не забудьте метод prepareAsync(), чтобы предотвратить зависание потока пользовательского интерфейса. Вы можете больше узнать о воспроизведении медиа здесь.

Ответ 3

MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);

try {
    if (mp.isPlaying()) {
        mp.stop();
        mp.release();

        mp = MediaPlayer.create(getApplicationContext(), R.raw.sound);
    }

    mp.start();
} catch (Exception e) {
    e.printStackTrace();
}