2014-03-12 68 views
0

我的应用程序和1个媒体播放器中有25个按钮。我想要什么:当我第一次点击播放声音时。当我第二次点击停止声音时 但是会发生什么:当我第一次点击它开始播放声音时,当我再次点击时,它不会停止它,而是从头开始播放它。 我的代码:只使用1个媒体播放器实例在相同按钮上播放和暂停媒体播放器?

MediaPlayer mp; 
    if(mp!=null) 
         { 
          mp.release(); 
          mp=null; 
         } 

         mp = MediaPlayer.create(MainActivity.this, R.raw.s5awesomeguitar); 
         mp.start(); 

如何设置我的代码播放媒体播放器上的第1点击,在第2点击停止声音。在同一个按钮上 Full Code:

gridView.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 

     switch (position) { 
     case 0: 
      if(mp!=null) 
      { 
       mp.release(); 
       mp=null; 
      } 
      else { 
      mp = MediaPlayer.create(Sadrzaj.this, R.raw.s3djclubmix); 
      mp.start(); 

      } 

     break; 
      case 1: 
       if(mp!=null) 
       { 
        mp.release(); 
        mp=null; 
       } 
       else { 
       mp = MediaPlayer.create(Sadrzaj.this, R.raw.s16dance); 
       mp.start(); 

       } 
      break; 
      case 2: 
       if(mp!=null) 
       { 
        mp.release(); 
        mp=null; 
       } 
       else { 
       mp = MediaPlayer.create(Sadrzaj.this, R.raw.s13ring); 
       mp.start(); 

       } 

       break; 

回答

1

MediaPlayer是一个状态机,here的Doc。

所以,首先阅读文档,状态图说:release()=> end。

所以,如果你想控制不同的按钮相同的轨道不呼吁release();并做你的案件之间设置集mp = null;

Dhaval给你正确的解决方案:

if (mp.isPlaying()) { mp.pause() } else { mp.play() }

此外,为了正确地释放玩家,先打电话复位()然后释放(),否则你会得到一个警告,称“玩家看到未处理的事件。“或类似的东西。

请确保你理解了状态图,它wiil工作就像一个魅力:)

综上所述:

  1. 阅读文档:)

  2. 检查播放状态的球员

  3. 删除不必要的电话释放()

  4. 一旦你完成,正确释放播放器

希望这有助于!

编辑: 好了,这里就是我想要做什么:(它可能无法编译,我只有一个文本编辑器,在这里很抱歉^^)

在你的活动(我想): 您的活动必须实现onPreparedListener

@Override 
onCreate() { 
if(mMediaPlayer == null) { 
     mMediaPlayer = new MediaPlayer() 
     mMediaPlayer.setOnPreparedListener(this); //registers your activity as the onPrepared Listener 
    } 
    ... 
} 

//Called back when media is ready to be played 
@Override 
onPrepared() { 
    if(mMediaPlayer != null){ 
     mMediaPlayer.start(); 
    } 
} 


gridView.setOnItemClickListener(new OnItemClickListener() { 
@Override 
public void onItemClick(AdapterView<?> parent, View view, 
     int position, long id) { 

    switch (position) { 
     case 0: 
      .. 
      break; 
     case 1: 
     if(mMediaPlayer.isPlaying() { 
      mMediaPlayer.pause(); 
     } else { 
      mMediaPlayer.reset(); 
      mMediaPlayer.setDataSource(Sadrzaj.this, R.raw.s16dance); 
      mMediaPlayer.prepareAsync();//call back onPrepared() 
      //mMediaPlayer.start(); sorry little mistake here no need to call start(); since it is called in onPrepared() 
     } 
     break; 
     default: 
      if(mMediaPlayer != null) { 
       mMediaPlayer.reset(); 
       mMediaPlayer.release(); 
       mMediaPlayer = null; 
      } 
      break; 
    } 
} 

//Release the player and de listener 
@Override 
onDestroy() { 
    if(mMediaPlayer != null) { 
     mMediaPlayer.setOnPreparedListener(null); 
     mMediaPlayer.reset(); 
     mMediaPlayer.release(); 
     mMediaPlayer = null 
    } 
} 
+0

它不会这样工作,我必须发布媒体播放器,所以我可以用不同的文件创建新的播放器并播放它。 'mp = MediaPlayer.create(Sadrzaj.this,R.raw.s2);' –

+0

为了澄清一下,你想每次点击另一个按钮时播放一个新的声音? – ChrisCarneiro

+0

是的。但是,当我点击两次相同的按钮,而不是再次播放同样的声音,我希望它停止。 –

0

您需要创建绑定到播放器的服务。该服务将是实际播放/更改曲目的服务,并且由于它们受到限制,将会更新播放器的活动。

0

你没有包含太多的信息,但我会给你的逻辑。

if(ButtonClick % 2 == 0){ 
    //Start playing the music 
} else { 
    //Stop playing the music 
} 

int i = 1; 

       Button.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
        if(i == 1){ 
         //StartPlaying music .play(); 
         i = 2 
        } else if (i==2){ 
         //StopPlaying the music .stop(); 
         i = 1 
        } 
      } 
    }); 

我建议你采用第二种方法。

+0

我试图用你的代码,而现在它需要点击两下就其他按钮播放声音。所以它会做什么:它会在任何按钮点击时停止MP。 –

0

检查媒体播放器是否在播放,如果是,则更改您的逻辑以暂停播放。否则做相反的事。

0
   Button.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
       if(mp.isPlaying()){ 
        //StartPlaying music .play(); 
        mp.pause(); 
       } else { 
        mp.start(); 
       } 
     } 
}); 
+0

同样的事情发生,需要2次点击播放其他按钮上的声音。第一次点击正在播放声音,第二次点击正在停止它。但让我们说我在按钮1上播放MP,并且我想在按钮2上播放mp。当我点击按钮2时,它完全停止媒体播放器,因此我必须再次单击以播放 –

+0

您可以发布soruce代码以便更好地理解 – 2014-03-19 11:37:57

+0

我添加了完整的代码 –