2013-12-13 18 views
11

Sto creando una nuova applicazione audio Android. Ho fatto un pulsante cliccabile per riprodurre il suono quando clicco su di esso. Ma voglio anche che smetta di suonare quando clicco per la seconda volta. Quella parte funziona bene ora ecco il problema, quando faccio nuovamente clic sul pulsante per riprodurre di nuovo il suono, non lo suona, il lettore multimediale è completamente fermo. Stavo cercando nei forum ma non riesco a trovare una risposta che possa aiutarmi. Ecco la mia attività:Media Player start start 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(); 

      } 


     } 

    }); 

Quando provo a scrivere mpButtonClick1.prepare(); Ottengo l'errore non gestita tipo di eccezione IOE eccezione

risposta

3

Cambiare la classe con il codice qui sotto:

rimuovere reset();.

Init e tutti i componenti:

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

Quando provo, ottengo "Sfortunatamente Splashzor si è fermato Errore –

+0

Pubblica il tuo logot. –

+0

http://prntscr.com/2atb96 ecco il log cat. Non ero sicuro di come pubblicarlo quindi ho fatto uno screenshot –

6

Prova questo: Si dovrebbe utilizzare un solo oggetto 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; 
     } 
    } 
} 
+1

reistanziare il lettore ogni volta è ciò che ha funzionato per me. È semplice e nessun overhead notevole .. grazie! – gnB

0

si sta chiamando mpButtonClick1.reset() dopo mpButtonClick1.stop() - non lo fanno:

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

la documentazione per reset() dicono :

Ripristina MediaPlayer allo stato non inizializzato. Dopo aver chiamato questo metodo, sarà necessario inizializzarlo di nuovo impostando l'origine dati e chiamando prepare().

Rimuovere mpButtonClick1.reset() e dovrebbe funzionare.

Ricorda che MediaPlayer funziona come una macchina a stati, il che significa che se si invocano metodi nell'ordine sbagliato, si avranno problemi. Si prega di leggere su MediaPlayer here e here.

8

Provare a utilizzare pause anziché stop.

Motivo: se si sospende lo MediaPlayer, è possibile riprenderlo in un secondo momento. Tuttavia, se si utilizza stop, quasi tutti gli altri metodi non funzioneranno e sarà necessario preparare nuovamente MediaPlayer (o crearne uno nuovo).

enter image description here

Maggiori informazioni: here e here

PS: non dimenticate di rilasciare la memoria quando si finisce di utilizzare le risorse.

+1

La risposta pulita, questa dovrebbe essere in primo piano. – Zub