2014-01-19 4 views
2

시작하려면 음악을 재생하고 중지하는 것이 좋습니다. 이미 SX를 검색 한 후이 문제에 대해 나열된 솔루션 중 일부를 시도했지만 문제점을 해결하지 못했습니다.Android Media Player에서 음악 재생 관련 문제

맨 처음부터 .mp3 파일을 다시 시작해야하는 "Replay Music"단추가 있습니다. 미디어 플레이어가 음악을 재생할 수 있도록 reset(), prepare() 등 필요한 코드가 있지만 버튼을 누르면 아무 일도 일어나지 않습니다.

나는 모든 것을 가지고 있습니다. OnClickListeners 및 기타 필요한 것들을 설치, 그냥이 하나의 문제가 아래

내 "재생 음악"메소드에 대한 전체 코드는 어떤 도움을 기꺼이받을 것

그냥 생각 :... 아마도 그것은 뭔가 mediaPlayer.start() 메서드 호출의 배치 관련 작업?

public void replaySoundButtonListener() { 
    Button testButton = (Button) findViewById(R.id.replayMusicButton); 
    testButton.setOnClickListener(new OnClickListener() { 

@Override 
public void onClick(View arg0) { 

    mediaPlayer.reset(); 
    try { 
     mediaPlayer.setDataSource("sdcard/InsomniMusic/insomnimix.mp3"); 
    } catch (IllegalArgumentException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IllegalStateException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    }  
try { 
    mediaPlayer.prepare(); 
} catch (IllegalStateException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
    mediaPlayer.start();  
} 
    }); 
} 
+0

자세한 내용은이 통화 정지(), 다음 (준비), 다음()를 다시 시작했다. reset()을 호출하거나 데이터 소스를 다시 설정하지 않아도됩니다. http://stackoverflow.com/questions/11533728/using-mediaplayer-to-replay-the-same-file – MikeHelland

답변

1

한 번만 미디어 플레이어의 데이터 소스를 준비하고 설정해야합니다. 재설정을 호출 할 때 미디어 플레이어를 완전히 다시 초기화해야합니다 (데이터 소스를 다시 설정하고 준비 호출). 당신은 내가 추측 노래의 시작에 MediaPlayer를를 재설정하려는 경우 노래가 이미 종료 (또는 다른 정지) 한 경우 만 mediaPlayer.start()이 충분

mediaPlayer.setOnSeekCompleteListener(new MediaPlayer.OnSeekCompleteListener() { 
    @Override 
    public void onSeekComplete(MediaPlayer mediaPlayer) { 
     mediaPlayer.start(); 
    } 
}); 

을 사용할 수 있습니다 (하지만 귀하의 경우 생각하면 그 사실을 결코 확신 할 수 없다). 시작 기능 here

+0

안녕하세요 제라드, 그렇습니다. 실제로 해당 메소드에서 수행해야 할 작업은 mediaPlayer.start()를 사용하는 것입니다. (사용자가 먼저 노래를 멈추고 * 다음 * 재생 버튼을 사용하는 화면의 지시 사항을 포함하므로) 알 수 있습니다. 도와 주셔서 감사합니다. – Paul

+0

재생 중에 노래를 다시 시작할 수 있다면 코드에서 너무 명확하지 않습니까? 그렇다면 먼저 노래 시작 부분을 찾아야합니다. 가능하지 않다면 (완료된 곡만 다시 시작할 수 있습니다) 그렇다면이 정도면 충분합니다! – Gerard

+0

또한 악명 높은 문제가 발생한다는 것을 추가해야합니다. 즉, 연주를 멈추고 다시 시도하기 시작하면 소리가 들리지 않습니다. 따라서 위의 코드에서 내가 가진 바가 있습니다. 재생하는 동안 사용자에게 노래를 다시 시작할 수 있습니다. 나는 사용자로부터 통제권을 빼앗는 습관이 아닙니다. – Paul

1
I made a functions to start() stop() reset() and pause() in another Class 

    import android.content.Context; 
    import android.media.MediaPlayer; 

    public class AudioPlayer extends MediaPlayer { 
     private MediaPlayer mPlayer; 

     public void stop() 
     { 
      if(mPlayer!=null) 
      { 
       mPlayer.release(); 
       mPlayer=null; 
      } 
     } 
     public void pause() 
     {  
      if(mPlayer.isPlaying())  { 
       mPlayer.pause(); 
        } 
      else 
      { 
       mPlayer.start(); 
      } 
     } 

     public void reset(Context c) 
     { 
      stop(); 

      mPlayer=MediaPlayer.create(c, R.raw.one_small_step); //uzimamo .create(context,..) jer uzimamo iz res/raw lokalne datoteke 

      mPlayer.setOnCompletionListener(new OnCompletionListener() { 

       @Override 
       public void onCompletion(MediaPlayer mp) { 
        stop(); 
       } 
      }); 

      mPlayer.start(); 
     } 


     public void play(Context c) 
     { 
      stop(); 

      mPlayer=MediaPlayer.create(c, R.raw.one_small_step); 

      mPlayer.setOnCompletionListener(new OnCompletionListener() { 

       @Override 
       public void onCompletion(MediaPlayer mp) { 
        stop(); 
       } 
      }); 

      mPlayer.start(); 
     } 
    } 

     //Here is my fragment 

    private Button mPlayButton; 
    private Button mStopButton; 
    private Button mPauseButton; 
    private Button mResetButton; 
    private AudioPlayer mPlayer=new AudioPlayer(); 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

      View v=getActivity().getLayoutInflater().inflate(R.layout.fragment_hello_moon, container); 

      mPlayButton=(Button)v.findViewById(R.id.hellomoon_playButton); 
      mPlayButton.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        mPlayer.play(getActivity()); 
       } 
      }); 
      mStopButton=(Button)v.findViewById(R.id.hellomoon_stopButton); 
      mStopButton.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        mPlayer.stop(); 

       } 
      }); 

      mPauseButton=(Button)v.findViewById(R.id.hellomoon_pauseButton); 
      mPauseButton.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        mPlayer.pause(); 

       } 
      }); 

      mResetButton=(Button)v.findViewById(R.id.hellomoon_resetButton); 
      mResetButton.setOnClickListener(new OnClickListener(
        ) { 

       @Override 
       public void onClick(View v) { 

        mPlayer.reset(getActivity()); 

       } 
      }); 
      return v; 
    } 


    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     mPlayer.stop(); //Nakon sto je fragment unisten MediaPlayer nastavlja radit jer je na drugacijem Threadu pa treba pozvati Stop(); 

    } 
관련 문제