2012-12-14 4 views
10

버튼을 터치 한 후 소리를 재생하고 싶습니다. MediaPlayer는 정상적으로 작동하지만,이 라이브러리는 음악과 같이 긴 .wav를위한 곳이라고 읽습니다.짧은 .wav 파일 재생 - Android

짧은 .wav (2-3 초)를 재생하는 더 좋은 방법이 있습니까?

+4

그래, ['SoundPool'] (http://developer.android.com/reference/android/media/SoundPool.html)는 갈 길입니다. – kcoppock

답변

24

SoundPool이 이에 대한 올바른 클래스입니다. 아래 코드는이 코드를 사용하는 방법의 예입니다. 또한 사운드를 관리하기 위해 여러 앱에서 사용하는 코드이기도합니다. 원하는대로 소리를 낼 수 있습니다 (또는 메모리 허용).

public class SoundPoolPlayer { 
    private SoundPool mShortPlayer= null; 
    private HashMap mSounds = new HashMap(); 

    public SoundPoolPlayer(Context pContext) 
    { 
     // setup Soundpool 
     this.mShortPlayer = new SoundPool(4, AudioManager.STREAM_MUSIC, 0); 


     mSounds.put(R.raw.<sound_1_name>, this.mShortPlayer.load(pContext, R.raw.<sound_1_name>, 1)); 
     mSounds.put(R.raw.<sound_2_name>, this.mShortPlayer.load(pContext, R.raw.<sound_2_name>, 1)); 
    } 

    public void playShortResource(int piResource) { 
     int iSoundId = (Integer) mSounds.get(piResource); 
     this.mShortPlayer.play(iSoundId, 0.99f, 0.99f, 0, 0, 1); 
    } 

    // Cleanup 
    public void release() { 
     // Cleanup 
     this.mShortPlayer.release(); 
     this.mShortPlayer = null; 
    } 
} 

당신은 호출하여 사용합니다 :

SoundPoolPlayer sound = new SoundPoolPlayer(this); 

를 액티비티의에서 onCreate()에서 (또는 언제 그 후). 당신이 소리와 함께 완료되면

sound.playShortResource(R.raw.<sound_name>); 

마지막으로, 전화 : 그 후, 사운드 간단한 전화를 재생

sound.release(); 

자원을 확보 할 수 있습니다.

+0

잘 작동하지만 두 가지 질문이 있습니다. 1. 매번 사용 후 (MediaPlayer와 같은) 또는 앱에서 종료 될 때마다 // 작업을 다시해야합니까? 2. 샘플을 멈출 방법이 있습니까? – CookieMonssster

+0

전체 앱 세션 동안 소리가 끝나면 버튼을 놓아야합니다. 따라서 onDestroy()가 좋은 선택입니다. SoundPools의 [pause() 메서드] (http://developer.android.com/reference/android/media/SoundPool.html#pause (int))를 사용하는 pause() 메서드를 추가 할 수 있습니다. –

+0

이것은 아주 쉬웠다. FWIW, Eclipse는 성능 향상을 위해'mSounds'에'SparseIntArray()'를 제안 했으므로 그렇게했습니다. –

관련 문제