Можно ли воспроизводить soundPool в oncreate()?

Я работаю над приложением, в котором при запуске нового действия оно должно начать воспроизводить звук. Поэтому я использовал медиаплеер для воспроизведения звука в oncreate, и он работал нормально. Но когда я попытался вместо этого использовать звуковой пул, загрузив и воспроизведя его при создании активности. Он не играет. Я выбираю звуковой пул, так как он лучше, чем медиаплеер.

в чем может быть проблема? звуковой пул не работает в oncreate?


person Adarsh H S    schedule 29.06.2012    source источник
comment
вы можете использовать звуковой пул в oncreate... и, пожалуйста, помните, что медиаплеер предназначен для воспроизведения больших файлов... звуковой пул предназначен для воспроизведения небольших звуков, таких как тик и т. д.   -  person Goofy    schedule 29.06.2012
comment
Я играю небольшой звук, похожий на приветствие, который отлично работает, когда я пытался воспроизвести его одним нажатием кнопки. но когда я делаю то же самое в oncreate, это не работает.   -  person Adarsh H S    schedule 29.06.2012
comment
можете ли вы опубликовать свою реализацию при создании звукового пула в onCreate и как его использовать.   -  person Niko    schedule 29.06.2012


Ответы (3)


Вы можете играть в нее где угодно,

Я продемонстрирую на простом примере

Создайте метод initializeSoundPool

private void initializeSoundPool(){
        mSoundPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);
        mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {
                public void onLoadComplete(SoundPool soundPool, int sampleId,
                        int status) {
                    loaded = true;
                }
            });
            soundID = mSoundPool.load(this, R.raw.glassbreak, 1);        
        }

Затем создайте метод playFile

private void playFile(){
 AudioManager audioManager = (AudioManager) getSystemService(AUDIO_SERVICE);
         float actualVolume = (float) audioManager
                 .getStreamVolume(AudioManager.STREAM_MUSIC);
         float maxVolume = (float) audioManager
                 .getStreamMaxVolume(AudioManager.STREAM_MUSIC);
         float volume = actualVolume / maxVolume;
         if (loaded) {
             mSoundPool.play(soundID, volume, volume, 1, 0, 1f);
             Log.e("Test", "Played sound");
         }
}

Затем в onCreate назовите их так

    private  SoundPool mSoundPool; 
    private int soundID;
    boolean loaded = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.spxml);
        initializeSoundPool();
            playFile();
    }

Или, что еще лучше, вызовите initializeSoundPool в onCreate, а затем вызовите playFile в onResume.

person Arif Nadeem    schedule 29.06.2012
comment
Я хотел бы вызвать оба метода initializesoundpool() и playfile() вне onCreate(). Но когда я пытаюсь, что звук играет. Не могли бы вы помочь в этом... - person Parthiban M; 10.02.2015

Возможно, вам просто нужно положить сон в метод onCreate.

У меня была почти такая же проблема, когда я пытался написать приложение, которому иногда нужно было воспроизводить звук, как только оно просыпалось. В конце концов, после долгих проб и ошибок, я обнаружил, что в выводе журнала появляется ошибка «образец НЕ ГОТОВ». Проблема заключалась в том, что загрузка звукового файла происходит асинхронно, и если вы попытаетесь воспроизвести звук до того, как он загрузится, произойдет сбой.

Предположительно существует механизм, который вы можете использовать, называемый setOnLoadCompleteListener, но я еще не видел примера того, насколько это действительно полезно. В приведенном выше примере из mirroredAbstraction (при условии, что он работает как рекламируется) все, что произойдет, если звук еще не загружен, — это то, что он не будет воспроизводить звук, который почти такой же, как у вас сейчас.

Если этот пример каким-то волшебным образом «решил» вашу проблему, то я бы предположил, что это произошло только потому, что все дополнительные накладные расходы в вызовах двух методов в основном дают вашему звуку время для загрузки до того, как он будет воспроизведен. Вероятно, вы могли бы добиться того же результата с помощью простого SystemClock.sleep(100) в onCreate между загрузкой и воспроизведением.

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

person Kevin Golding    schedule 17.12.2012
comment
Извините что поздно отвечаю. +1 за ваш ответ. Я решил проблему, загрузив звуковые пулы в асинхронном потоке, а также используя setOnLoadCompleteListener(), чтобы проверить, загружены ли все звуковые пулы перед их воспроизведением. Просто поделитесь информацией, если вы все еще ищете решение. :) - person Adarsh H S; 11.06.2013

В качестве альтернативы вы можете переопределить OnWindowFocusChanged для воспроизведения файла при запуске Activity...

Что-то вроде этого ...

  public class YourActivity extends Activity {
  .
  .
  .
   private Handler mHandler;

   public void onCreate(Bundle savedInstanceState) {
   .
   .
   .
   this.mHandler = new Handler();

   .
   .
   .

   }



public void onWindowFocusChanged(boolean paramBoolean)
      {

 if (paramBoolean)
                 {
          this.mHandler.postDelayed(new Runnable()
          {
            public void run()
            {

                // Refer to the answer above to create the play function for your soundfile ... 


            YourActivity.this.play("The sound from the sound pool");
            }
          }
          , 1000L);
      }

}

person diptia    schedule 09.07.2012