2013-12-13 5 views
11

Ich mache eine neue Android-Sound-Anwendung. Ich habe einen anklickbaren Button zum Abspielen von Sounds erstellt, wenn ich darauf klicke. Aber ich möchte auch, dass es aufhört, Töne zu hören, wenn ich zum zweiten Mal klicke. Dieser Teil funktioniert nun gut hier ist das Problem, wenn ich erneut auf die Schaltfläche klicke, um den Ton erneut abzuspielen, es wird nicht abgespielt, der Media Player wird komplett gestoppt. Ich habe in Foren gesucht, aber ich kann keine Antwort finden, die mir helfen könnte. Hier ist meine Aktivität:Media Player Start Stop Start

MediaPlayer mpButtonClick1; 
MediaPlayer mpButtonClick2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.prvi); 

    final MediaPlayer mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm); 
    final MediaPlayer mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs); 


    Button dugme = (Button) findViewById(R.id.dugme); 
    dugme.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (mpButtonClick1.isPlaying()) { 
       mpButtonClick1.stop(); 
       mpButtonClick1.reset(); 

      } 
      else {    
       mpButtonClick1.start(); 

      } 


     } 

    }); 

Wenn ich versuche, mpButtonClick1.prepare zu schreiben(); Ich bekomme Fehler Unbehandelte Ausnahme Typ IOE Ausnahme

Antwort

3

Ändern Sie Ihre Klasse mit folgenden Code verwenden:

reset(); entfernen.

init gut alle Komponenten:

MediaPlayer mpButtonClick1; 
MediaPlayer mpButtonClick2; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.prvi); 

    mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm); 
    mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs); 


    Button dugme = (Button) findViewById(R.id.dugme); 
    dugme.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (mpButtonClick1.isPlaying()) { 
       mpButtonClick1.stop(); 
      } 
      else {    
       mpButtonClick1.start(); 
      } 
     } 

    }); 
+0

Wenn ich das versuche, bekomme ich "Leider Splashzor hat aufgehört. Fehler –

+0

Veröffentlichen Sie Ihre Logcat. –

+0

http://prntscr.com/2atb96 hier ist die Protokoll Katze. Ich war mir nicht sicher, wie man es post, also habe ich einen Screenshot –

6

Try this: Sie sollten nur ein Mediaplayer Objekt

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; 
     } 
    } 
} 
+1

neu instanziieren den Spieler jedes Mal ist, was für mich gearbeitet hat. Es ist einfach und kein spürbarer Overhead .. Danke! – gnB

0

Du nennst mpButtonClick1.reset() nach mpButtonClick1.stop() - tun Sie das nicht:

if (mpButtonClick1.isPlaying()) { 
    mpButtonClick1.stop(); 
    mpButtonClick1.reset(); //<--------- calling reset(), remove this line 
} 

Die Dokumentation für reset() sagen :

Setzt den MediaPlayer in den nicht initialisierten Zustand zurück. Nachdem Sie diese Methode aufgerufen haben, müssen Sie sie erneut initialisieren, indem Sie die Datenquelle festlegen und prepare() aufrufen.

Entfernen Sie mpButtonClick1.reset() und es sollte funktionieren.

Denken Sie daran, dass MediaPlayer als Zustandsmaschine funktioniert, was bedeutet, dass Sie Probleme bekommen, wenn Sie Methoden in der falschen Reihenfolge aufrufen. Bitte lesen Sie über MediaPlayer here und here.

8

Versuchen Sie pause anstelle von stop zu verwenden.

Grund: Wenn Sie die MediaPlayer anhalten, können Sie sie später fortsetzen. Wenn Sie jedoch stop verwenden, funktioniert fast keine andere Methode und Sie müssen den MediaPlayer erneut vorbereiten (oder einen neuen erstellen).

enter image description here

Weitere Informationen: here und here

PS: vergessen Sie nicht, den Speicher freizugeben, wenn Sie mit den Ressourcen beenden.

+1

Die saubere Antwort, sollte dies oben sein. Thnx – Zub