2012-09-04 14 views
15

Estoy creando una aplicación de Android que contiene 2 botones, al hacer clic en cada botón reproducir un archivo mp3. El problema es cuando juego button1 que juega sound1, cuando hago clic en button2 se reproduce sound2.Android MediaPlayer Detener y jugar

puedo comprobar en cada botón otro jugador si está funcionando y lo paro y juega el hecho clic en uno

Pero si hago clic en el mismo botón dos veces que es mantener la primera reproducción de audio en el fondo y jugar otra vez

Intenté comprobar isPlaying() y detenerlo, pero no funciona.

Quiero Si hago clic en button1 juegue sound1 y si vuelve a hacer clic en él deténgalo y vuelva a reproducirlo desde el principio.

Mi código:

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(); 
      } 
     }); 
    } 
} 

esperanza si hay cualquier código mejor que se puede usar varios botones como una matriz o algo que no se marque cada botón y cada vez que el jugador.

Respuesta

31

Debe utilizar sólo un reproductor de medios objeto

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

Gracias, que funcione bien –

+1

Ningún hombre problema :) – mario

+0

@mario fui loco buscando una manera de poner en práctica reproductor de medios en mi aplicación y aunque muchas personas estaban ayudando o al menos tratando de evitar sin éxito. Tu hiciste el truco. El único problema que tengo ahora es dónde poner el código, dónde/cómo comprobar si el sonido dejó de reproducirse. Una vez que el sonido deja de reproducirse, quiero mostrar un botón. Subí tu respuesta. – Si8

2

De acuerdo con el ciclo de vida Media Player, que se puede ver en el Android API guide, creo que usted tiene que llamar a reset() en lugar de parada(), y después de eso prepare de nuevo el reproductor multimedia (use solo uno) para reproducir el sonido desde el principio. Tenga en cuenta también que el sonido puede haber terminado, por lo que también recomendaría implementar setOnCompletionListener() para asegurarse de que si intenta reproducir de nuevo el sonido no falla.

1

Para detener el reproductor de medios, sin el riesgo de una excepción de estado ilegal, debe hacer

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

en lugar de sólo

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

por si acaso alguien se acerca a esta pregunta, tengo el versión más fácil.

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(); 
      } 
     }); 
    } 
Cuestiones relacionadas