2014-03-12 309 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

我添加了完整的代碼 –