2011-03-29 5 views
3

소리를 재생하고 싶습니다. 처음에는 잘 작동하지만, 멈추고 다시 시작하려면 아무 일도 일어나지 않습니다. 어떤 생각입니까?Android MediaPlayer가 중지 된 후 다시 시작되지 않습니다.

final MediaPlayer mp = MediaPlayer.create(getApplicationContext(), R.raw.sex); 
ImageButton andvib = (ImageButton)findViewById(R.id.vib_toggle); 
final AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE); 
andvib.setOnClickListener(new View.OnClickListener(){ 
    @Override 
    public void onClick(View v) { 
     am.setStreamVolume(AudioManager.STREAM_MUSIC, vol, 0); 
     Vibrator vibr = (Vibrator)getSystemService(Context.VIBRATOR_SERVICE); 
     vibr.cancel(); 
     if(vibrating==false) { 
      if(style == 0) 
       vibr.vibrate(durat, 0); 
      if(style == 1){ 
       vibr.vibrate(staccato, 0); 
      } 
      if(style == 2){ 
       vibr.vibrate(wild, 0); 
      } 
      try { 
       mp.prepare(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      mp.start(); 
      mp.setLooping(true); 
      vibrating = true; 
     } 
     else { 
      vibrating = false; 
      mp.stop(); 
      try { 
       mp.prepare(); 
      } catch (IllegalStateException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      vibr.cancel(); 
     } 
    } 
}); 

답변

0

당신은 당신이 두 번째 start()를 호출하기 전에 mp.prepare()를 호출 할 수 있습니다.

+0

아니, –

+0

를 작동하지 않는 당신이 당신의 로그 출력의 종류를 받고 있습니까? – FoamyGuy

+0

아니, 내 진짜 전화 becaue 내 eumlator에서 출력 소리를 테스트 중이 야. –

5

MediaPlayer를 사용하는 경우, 당신은 항상 당신이 여기에서 볼 수있는 상태 변화도를 참조해야합니다 :

http://developer.android.com/reference/android/media/MediaPlayer.html

당신이 MediaPlayer를에 정지()를 호출 한 후, 그림에서 볼 수 있듯이, 그것은 중지됨 상태로 이동하고 play()를 호출하기 전에 prepare()를 다시 호출하여 Prepared 상태로 전환해야합니다.

준비가 오래 걸릴 수 있으므로 항상 그렇게하는 것은 특히 사용자가 메인 스레드에서 수행하는 경우 (MediaPlayer를 준비하는 동안 UI가 멈춤) 사용자 환경이 좋지 않을 수 있음을 기억하십시오. 사운드를 자주 재생할 경우 실제로는 한 번 준비() 한 다음 시작, 일시 중지 또는 재생 완료 상태로 유지해야합니다.

브루노 올리베이라, 개발자 프로그램 엔지니어, 구글

+0

좋습니다. 그러나 매번 사운드를 다시 시작하기 전에 prepare()를하기 전에 정상적으로 작동해야합니다. –

+0

@Liam : 게시 한 코드에 하나도 없습니다. onClick에서 mp.start() 전에 mp.prepare()를 호출해야합니다. 그렇지 않으면 mp.stop() 대신 mp.pause()를 사용하십시오. 물론 중단되지 않은 부분에서 계속 진행됩니다. – kcoppock

+0

죄송합니다, 여기에 새 코드가 있습니다 (메인 포스트를 업데이트했습니다!) –

관련 문제