Воспроизвести звук на примере Soundpool

Я хотел бы научиться использоватьsoundpool метод. Я хотел бы, чтобы вы показали мне очень простой пример, который запускает 2 звука.

Ответы на вопрос(5)

Да. Я тоже прошел через это. но для безопасности я сохранил часть кода, которую нашел в Интернете. Хотя я не использовал его, я знаю, он скоро пригодится ...

1) Вам необходимо создать объект AudioAttributes:

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

2) Создать объект SoundPool:

SoundPool sounds = new SoundPool.Builder()
    .setAudioAttributes(attributes)
    .build();

3) Как использовать SoundPool на всех уровнях API, например:

SoundPool sound;

protected void createSoundPool() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        createNewSoundPool();
    } else {
        createOldSoundPool();
    }
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
protected void createNewSoundPool(){
    AudioAttributes attributes = new AudioAttributes.Builder()
        .setUsage(AudioAttributes.USAGE_GAME)
        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
        .build();
    sounds = new SoundPool.Builder()
        .setAudioAttributes(attributes)
        .build();
}

@SuppressWarnings("deprecation")
protected void createOldSoundPool(){
    sounds = new SoundPool(5,AudioManager.STREAM_MUSIC,0);
}
 Erik Melkersson03 дек. 2016 г., 16:06
Примечание: Вы хотите, чтобы .setMaxStreams (5) на Builder также создавался в createNewSoundPool, если вы хотите иметь такое же поведение, чтобы воспроизводить несколько звуков одновременно, как в старом. Также 5 может быть последним int или чем-то другим.

Вот маленький,за работой примерsoundPoolвзято изВот и слегка доработан, чтобы соответствовать посту 21 API 's.

Стоит заметитьmaxStreams, который указывает, сколько потоков разрешено запускать параллельно, если это один (по умолчанию), он может быть удален из компоновщика.

import android.app.Activity;
import android.content.Context;
import android.media.AudioManager;
import android.media.SoundPool;

public class SoundManager extends Activity
{
  static SoundPool soundPool;
  static int[] sm;

  public static void InitSound() {

    int maxStreams = 1;
    Context mContext = getApplicationContext();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        soundPool = new SoundPool.Builder()
                .setMaxStreams(maxStreams)
                .build();
    } else {
        soundPool = new SoundPool(maxStreams, AudioManager.STREAM_MUSIC, 0);
    }

    sm = new int[3];
    // fill your sounds
    sm[0] = soundPool.load(mContext, R.raw.sound_1, 1);
    sm[1] = soundPool.load(mContext, R.raw.sound_2, 1);
    sm[2] = soundPool.load(mContext, R.raw.sound_3, 1);

  }

  static void playSound(int sound) {

      soundPool.play(sm[sound], 1, 1, 1, 0, 1f);
  }

   public final void cleanUpIfEnd() {
    sm = null;
    soundPool.release();
    soundPool = null;
  } 
}
 soztrk18 июн. 2018 г., 05:43
getApplicationContext (); вызывает ошибку. "Нестатический метод не может быть вызван из статического контекста "
 jk710 апр. 2018 г., 02:33
Плюс один за полезный ответ, несмотря на то, что строка amg завершена излишне (проверено без нее)
 m0skit020 дек. 2017 г., 10:42
Он инициализируется, но никогда не используется.
 FracturedRetina03 июн. 2017 г., 03:35
amg ISN»т использовал
Решение Вопроса

Создать папку с именем каксырье подyour_app/res/, Затем вставьте свой рингтон в эту папку, напримерyour_app/res/ringtone.mp3, Теперь используйте следующий код:

SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
int soundId = soundPool.load(context, R.raw.ringtone, 1);
// soundId for reuse later on

soundPool.play(soundId, 1, 1, 0, 0, 1);

Обязательно освободите ресурсы SoundPool после использования:

soundPool.release();
soundPool = null;
 voghDev27 мар. 2017 г., 07:26
Последние две строки (вещь MediaPlayer) не являются необходимыми. В остальном это было полезно. Спасибо:)
 Noumenon14 дек. 2014 г., 01:25
Конструктор SoundPool теперь устарел, но поскольку SoundPool.Builder требует API уровня 21, я полагаю, чтоЯ все еще использую это.
private final int NUMBER_OF_SIMULTANEOUS_SOUNDS = 5;
        private final int LEFT_VOLUME_VALUE = 1.0f;
        private final int RIGHT_VOLUME_VALUE = 1.0f;
        private final int MUSIC_LOOP = 0;
        private final int SOUND_PLAY_PRIORITY = 0;
        private final float PLAY_RATE= 1.0f;


        SoundPool soundPool;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            soundPool= new SoundPool.Builder()
                    .setMaxStreams(NUMBER_OF_SIMULTANEOUS_SOUNDS)
                    .build();
        } else {
            // Deprecated way of creating a SoundPool before Android API 21.
            soundPool= new SoundPool(NUMBER_OF_SIMULTANEOUS_SOUNDS, AudioManager.STREAM_MUSIC, 0);
        }
        int soundId = soundPool.load(getApplicationContext(), R.raw.sound_1, 1);

        soundPool.play(soundId , LEFT_VOLUME_VALUE , RIGHT_VOLUME_VALUE, SOUND_PLAY_PRIORITY , MUSIC_LOOP ,PLAY_RATE);

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

Благодарю.

 Ashwani K10 июн. 2016 г., 09:16
Что вы подразумеваете под нечитаемым?
 Ivan G.06 июн. 2016 г., 11:42
код в статье не читается
 tim4dev11 нояб. 2017 г., 18:43
Интересный образец. onLoadComplete + обратный вызов
 CODE-REaD19 июл. 2016 г., 16:02
Я нахожу код SoundPoolManager читабельным, но польза от использования int вместо SoundPool мне не ясна. Я'Я предполагаю, что это для удобства. Было бы полезно, если бы вы объяснили это более полно. Устраняет ли SoundPoolManager недостатки SoundPool, делает мой код более безопасным / более переносимым / более управляемым / более эффективным? Если так, то как и почему? Заранее спасибо.

Ваш ответ на вопрос