2012-03-11 3 views
36

화면에 여러 개의 이미지가있는 응용 프로그램을 만들고 있는데,이 이미지는 버튼이되고 탭하면 짧은 사운드가 재생됩니다. 나는 이것을 연구했고, 소리를내는 데 사용하고있는 현재의 방법만을 찾을 수있었습니다. 전혀 반응이없는 것처럼 보입니다. 나는 소리가 빨리 재생되고 많은 빠른 탭에 반응하기를 원합니다. 안드로이드에서도 이것이 가능한지 확신 할 수 없었다.안드로이드 짧은 소리를 재생하는 올바른 방법은?

내 사운드를 재생하기 위해 사용하고 코드는 이것이다 :

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에서 소리를 재생하는 방법에 대한 제안은 감사하겠습니다.

감사합니다.

사운드 풀을 발견하기 때문에, 내가 이것을 사용하려면 코드를 편집 한 그것은 완벽하게 작동, 새로운 코드는 다음과 같습니다

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); 

      } 

    }); 


    } 

감사

+2

soundPoolMap을 사용하고있는 것처럼 보이지 않습니까? – Moberg

+1

당신이 구현 한 방식을 좋아하고, 동시에 멋지게 일했습니다. – desgraci

+0

대단히 고마워요. 그것은 위대한 작품 ...! –

답변

25

당신은 SoundPool를 사용할 수 있습니다. 그것은 당신이 완벽하게하고 싶은 것에 적합합니다.

각 이미지 (또는 버튼)에 해당하는 사운드 효과 ID를 저장하는 방법 만 있으면됩니다.

아마도 연결된 사운드 효과 ID를 저장하기 위해 버튼을 확장하십시오. 그리고 버튼을 눌렀을 때 일반적인 SoundPool을 사용하여 id와 관련된 사운드 효과를 재생하십시오.

You can read more about SoundPool here.

+1

당신의 충고와 링크를 가져 주셔서 감사합니다.이 부분을 더 살펴보면서 튜토리얼을 발견하면 도움이되었습니다. 내가 원했던대로, 확실히 미디어 플레이어보다 훨씬 낫다! 많은 감사합니다! – deucalion0

+0

자습서에 대한 링크를 게시 하시겠습니까? – Moberg

+0

@Moberg 여기에 하나 있습니다 http://stackoverflow.com/questions/17069955/play- sound-using-soundpool-example –

3

@Rikonator는 Soundpool과 함께 오른쪽 트랙에 있습니다. 그것은 당신이 일하는 종류의 기능에 훨씬 더 적합합니다.

어쨌든 mediaplayer를 사용하기로 결정했다면 prepareAsync() 메소드를 잊어 버리지 않아야 UI 스레드가 멈추지 않습니다. 미디어 재생에 대한 자세한 내용은 here을 참조하십시오.

+1

사운드가 버튼에 사용되는 것처럼 UI 스레드에서 차단하는 것이 더 좋을 수도 있습니다. UI를 정지시키는 것은 좋지 않을 수도 있지만, 늦게 발사하는 소리는 좀 더 이상하지 않습니다. – Tonithy

2
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(); 
} 
관련 문제