2014-01-19 141 views
2

首先,播放和停止音乐可以正常工作。我已经搜索了SX,并尝试了一些针对此问题列出的解决方案,但他们还没有解决我的问题。在Android媒体播放器中播放音乐的问题

我有一个“Replay Music”按钮,应该从头开始重新启动.mp3文件。我已经准备好了必要的代码(比如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必须完全重新初始化(再次设置数据源并呼叫准备)。如果您想重置媒体播放器到我猜歌曲的开始,你可以使用

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

如果歌曲已经结束(或者停止),仅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(); 

    }