2013-08-21 63 views
5

我有一個問題,一旦用戶點擊聲音播放我的ListView,然後當聲音播放時,他們點擊另一個聲音,他們點擊播放的2個聲音同一時間。媒體播放器同時播放多個文件

我想要播放當前正在播放,完成的聲音,然後開始他們最近點擊的新聲音。

如果有人能幫助我,那將非常感謝!

CODE:

ListView BoardList = (ListView) findViewById(R.id.BoardList); 

    String List[] = { 

    "Audio1", "Audio2", "Audio3", "Audio4", "Audio5" 
     , "Audio6", "Audio7", "Audio8", "Audio9" 
      , "Audio10", "Audio11", "Audio12" }; 

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
      R.layout.listcustomize, R.id.textItem, List); 

    BoardList.setAdapter(adapter); 

    BoardList.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, 
       int position, long id) { 
      MediaPlayer mPlayer = null; 
      if (position == 0) { 



       mPlayer = MediaPlayer.create(HodgeMain.this, 
         R.raw.Audio1); 
       mPlayer.start(); 
      } 

      if (position == 1) { 


       mPlayer = MediaPlayer.create(HodgeMain.this, 
         R.raw.Audio2); 
       mPlayer.start(); 

      } 
      if (position == 2) { 


       mPlayer = MediaPlayer.create(HodgeMain.this, R.raw.Audio3); 
       mPlayer.start(); 

      } 
      if (position == 3) { 


       mPlayer = MediaPlayer.create(HodgeMain.this, 
         R.raw.Audio4); 
       mPlayer.start(); 
      } 
      if (position == 4) { 


       mPlayer = MediaPlayer.create(HodgeMain.this, 
         R.raw.Audio5); 
       mPlayer.start(); 
      } 
      if (position == 5) { 


       mPlayer = MediaPlayer.create(HodgeMain.this, 
         R.raw.Audio6); 
       mPlayer.start(); 
      } 
      if (position == 6) { 


       mPlayer = MediaPlayer.create(HodgeMain.this, 
         R.raw.Audio7); 
       mPlayer.start(); 
      } 

      if (position == 7) { 


       mPlayer = MediaPlayer 
         .create(HodgeMain.this, R.raw.Audio8); 
       mPlayer.start(); 
      } 
      if (position == 8) { 


       mPlayer = MediaPlayer.create(HodgeMain.this, 
         R.raw.Audio9); 
       mPlayer.start(); 
      } 
      if (position == 9) { 


       mPlayer = MediaPlayer.create(HodgeMain.this, 
         R.raw.Audio10); 
       mPlayer.start(); 
      } 
      if (position == 10) { 


       mPlayer = MediaPlayer.create(HodgeMain.this, 
         R.raw.Audio11); 
       mPlayer.start(); 
      } 
      if (position == 11) { 

       mPlayer = MediaPlayer.create(HodgeMain.this, 
         R.raw.Audio12); 
       mPlayer.start(); 

      } 
+6

未經請求的建議=>通常情況下,當您重複同樣的事情時,可以更有效地編寫代碼。 – ChiefTwoPencils

回答

5
Media player playing multiple files at the same time 

嘗試

聲明常見MediaPlayer mPlayer;所有

BoardList.setAdapter(adapter); 
MediaPlayer mPlayer; 

然後用mPlayer.release();

if (position == 0) { 

    if(mPlayer!=null) 
    { 
     mPlayer.release(); 
     mPlayer=null; 
    } 

    mPlayer = MediaPlayer.create(HodgeMain.this, 
      R.raw.Audio1); 
    mPlayer.start(); 

} 
. 
. 
. 
. 
if(position==N) 
{ 
     if(mPlayer!=null) 
     { 
      mPlayer.release(); 
      mPlayer=null; 
     } 
     mPlayer = MediaPlayer.create(HodgeMain.this, 
       R.raw.AudioN); 
     mPlayer.start(); 
} 

關於release():

Releases resources與此相關的MediaPlayer object

當您使用MediaPlayer完成時,調用此方法被認爲是一種好的做法。

特別是,無論何時Activity of an application is paused (its onPause() method is called), or stopped (its onStop() method is called),此方法應該是invoked to release the MediaPlayer object,除非應用程序有特殊需要保留該對象。

PS。我已經嘗試過release()這工作正常!

例子:這是爲我工作

try { 

if (position == 1) { 
    if (mPlayer != null) { 
     mPlayer.release(); 
     mPlayer = null; 
    } 
    mPlayer = MediaPlayer.create(MainActivity.this, R.raw.all); 
    mPlayer.start(); 
} 
if (position == 2) { 
    if (mPlayer != null) { 
     mPlayer.release(); 
     mPlayer = null; 
    } 
    mPlayer = MediaPlayer.create(MainActivity.this, R.raw.all2); 
    mPlayer.start(); 
} 
} 

catch (Exception e) { 
    // TODO: handle exception 
    e.printStackTrace(); 
} 
+0

當我在「mPlayer.start」之前添加該代碼時,它不能解決問題。 – Jack

+1

@Jack嘗試更新回答! –

+0

我已在我的答案中更新了我的代碼,以便您可以查看我是否已正確完成所有操作。出於某種原因,音頻文件仍在播放。 – Jack

0

之前,我們開始考慮執行下列操作:

if(mPlayer.isPlaying()) mPlayer.stop(); 
mPlayer.start(); 

if語句中實現它,看看它是否適合你!

但是爲了達到這個目的,你必須在更廣泛的範圍內定義MediaPlayer對象,而不是每次聲明新的MediaPlayer對象。

+0

出於某種原因,當我這樣做時,應用程序崩潰。 – Jack

+0

發佈你的堆棧跟蹤,然後看看它爲什麼崩潰! – Pavlos

0

問題是靜態方法MediaPlayer.create();實際上是爲你返回一個新的MediaPlayer實例。

的多個原因被打是因爲你沒有停止之前播放音頻文件(如其他建議)。

調用此方法之前調用MediaPlayer.create():

private void killSounds(){ 
    try{ 
     mPlayer.stop(); 
     mPlayer.release(); 
    } 
    catch(Exception e) { 
     //Eat it and do nothing because it's just going to be an NPE when mPlayer is null, which doesn't matter because we're handling it 
    } 
} 

你已經停止以前的MediaPlayer後,你應該能夠創建無聲音重疊的新的。

+0

當我使用它時,它仍然互相重疊。另外,我必須刪除「private void killSounds(){」,因爲它會引發錯誤。 – Jack

+0

如果你在這方面遇到了錯誤,那麼你的代碼完全有其他問題。你用靜態方法運行所有這些,不是嗎? – Guardanis

相關問題