2014-12-10 4 views
2

SoundPool에서 mp3 파일을 실행하려고합니다. SoundPool.load로 mp3를로드했지만 SoundPool.play를 시도해도 작동하지 않으며 예외가 발생하지 않습니다. API21을 사용하고 있습니다.SoundPool이 MP3를 재생하지 못합니까?

어떻게 해결할 수 있습니까?

나는 이것을 시도하고있다.

public class CustomSoundPool { 

    //SDK Version 
    public SoundPool getSoundPool(){ 
     SoundPool sounds = null; 

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

      sounds = new SoundPool.Builder() 
      .setAudioAttributes(attributes) 
      .build(); 
     }else{ 
      sounds = new SoundPool(5,AudioManager.STREAM_MUSIC,0); 
     } 
     return sounds; 
    } 

} 




/** play sound with error or success */ 
     private void playSound(){ 
      SoundPool sound = new CustomSoundPool().getSoundPool(); 
      if(resposta.getValor() == 1){ 
       int soundId = sound.load(getView().getContext(), R.raw.sucesso, 1); 
       sound.play(soundId, 1, 1, 0, 0, 1); 
      }else{ 
       int soundId = sound.load(getView().getContext(), R.raw.erro, 1); 
       sound.play(soundId, 1, 1, 0, 0, 1); 
      } 
      sound.release();    
     } 

답변

6

SoundPool이 너무 일찍 출시됩니다. 나중에 onDestroy 방법으로 Activity의 출시를 수행합니다. 이제 사운드는 SoundPool 개체가 사용하는 모든 메모리와 원시 리소스가 해제되기 전에 재생할 시간이 충분하지 않습니다. 또한 실제로로드를 관리하기 전에 사운드를 빨리 재생하려고합니다. 사운드가로드되기 전에 play을 사용할 수 없습니다. SoundPool.OnLoadCompleteListener#onLoadComplete을 사용하면 사운드가로드되고 내부 청취자가 사운드를 재생할 때까지 기다릴 수 있습니다.

SoundPool soundPool; 
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    AudioAttributes attributes = new AudioAttributes.Builder() 
      .setUsage(AudioAttributes.USAGE_GAME) 
      .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION) 
      .build(); 

      soundPool = new SoundPool.Builder() 
         .setAudioAttributes(attributes) 
         .build();  
} 
else { 
    soundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0); 
} 
soundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() { 
    @Override 
    public void onLoadComplete(SoundPool soundPool, int sampleId, int status) { 
     soundPool.play(sampleId, 1.0f, 1.0f, 0, 0, 1.0f); 
    } 
}); 
soundPool.load(this, R.raw.sucesso, 1); 
+0

나는 제안을해도 작동하지 않습니다. 소리가 실행되지 않으면 재생 – FernandoPaiva

+0

편집 된 답변보기. –

+0

이 정상적으로 작동합니다. 고마워요! – FernandoPaiva