Правильный способ воспроизводить короткие звуки Android? - PullRequest
39 голосов
/ 11 марта 2012

Я создаю приложение, которое будет иметь несколько изображений на экране, эти изображения будут кнопками, а при нажатии будет воспроизводиться короткий звук.Я исследовал это и смог найти только текущий метод, который я использую для воспроизведения звуков, который вообще не выглядит адаптивным.Я хочу, чтобы звук воспроизводился быстро и реагировал на множество быстрых нажатий.Я не был уверен, возможно ли это даже в 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);

            }

    });


    }

Спасибо

Ответы [ 3 ]

27 голосов
/ 11 марта 2012

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

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

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

Подробнее о SoundPool можно прочитать здесь .

3 голосов
/ 11 марта 2012

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

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

2 голосов
/ 22 января 2016
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();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...