2012-09-04 199 views
15

我創建的Android應用程序包含2個按鈕,點擊每個按鈕播放一個mp3文件。 問題是當我玩button1它播放sound1,當我點擊button2它播放sound2Android MediaPlayer停止並播放

我上的每個按鈕檢查其他球員,如果它的工作,我停止和播放點擊一個

,但如果我點擊同一按鈕兩次是保持第一音頻播放的背景和再次播放另一個

我試圖檢查isPlaying()並阻止它,但它不起作用!

我想要如果我點擊button1,它會播放sound1,如果再次點擊它會停止播放並從頭開始播放。

我的代碼:

package com.hamoosh.playaudio; 
import android.app.Activity; 
import android.media.MediaPlayer; 
import android.media.MediaPlayer.OnCompletionListener; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class PlayaudioActivity extends Activity { 
/** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     Button b= (Button) findViewById(R.id.button1); 
     Button b2= (Button) findViewById(R.id.button2); 
     final TextView t= (TextView) findViewById(R.id.textView1); 

     final MediaPlayer mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far); 
     final MediaPlayer mp1 = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet); 

     b.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (mp1.isPlaying()) { 

        mp1.stop(); 
       } 

       mp.start(); 
      } 

     }); 

     b2.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       if (mp.isPlaying()) { 

        mp.stop(); 
       } 
       mp1.start(); 
      } 
     }); 
    } 
} 

希望如果有什麼更好的代碼,可以使用多個按鈕數組或東西不檢查每個按鈕和球員的每一次。

回答

31

你應該只使用一個MediaPlayer對象

public class PlayaudioActivity extends Activity { 

     private MediaPlayer mp; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.main); 
      Button b = (Button) findViewById(R.id.button1); 
      Button b2 = (Button) findViewById(R.id.button2); 
      final TextView t = (TextView) findViewById(R.id.textView1); 

      b.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        stopPlaying(); 
        mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far); 
        mp.start(); 
       } 

      }); 

      b2.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) { 
        stopPlaying(); 
        mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet); 
        mp.start(); 
       } 
      }); 
     } 

     private void stopPlaying() { 
      if (mp != null) { 
       mp.stop(); 
       mp.release(); 
       mp = null; 
      } 
     } 
    } 
+0

謝謝,它做工精細 –

+1

沒有問題的人:) – mario

+0

@mario我瘋了尋找一種方式來實現我的應用程序和雖然很多人幫助,或者至少試圖幫助我的媒體播放器,但沒有成功。你做的伎倆。我現在唯一的問題是在哪裏放置代碼,在哪裏/如何檢查聲音是否停止播放。一旦聲音停止播放,我想顯示一個按鈕。我Upvoted你的答案。 – Si8

2

據媒體播放器的生命週期,您可以在Android API guide觀點,我認爲你必須調用reset(),而不是停止(),和之後,再次準備媒體播放器(僅使用一個)播放來自開始的聲音。考慮到聲音可能已經完成,所以我還建議實施setOnCompletionListener()以確保如果您嘗試再次播放聲音,它不會失敗。

1

要停止媒體播放器沒有非法狀態異常的風險,你必須做

try { 
     mp.reset(); 
     mp.prepare(); 
     mp.stop(); 
     mp.release(); 
     mp=null; 
     } 
    catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

,而不是僅僅

try { 
     mp.stop(); 
     mp.release(); 
     mp=null; 
    } 
catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 
0

以防萬一有人談到這個問題,我有更容易版本。

public static MediaPlayer mp; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Button b = (Button) findViewById(R.id.button); 
     Button b2 = (Button) findViewById(R.id.button2); 


     b.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       mp = MediaPlayer.create(MainActivity.this, R.raw.game); 
       mp.start(); 
      } 
     }); 

     b2.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       mp.stop(); 
       // mp.start(); 
      } 
     }); 
    } 
相關問題