Pregunta

Tengo un botón que reproduce un archivo de audio en su detector de clics. Si se hace clic en el botón una y otra vez mientras que el archivo de audio se reproduce a continuación, la aplicación se bloquea. ¿Cuál es la solución?

Aquí hay un código de referencia:

 private OnClickListener btnMercyListener = new OnClickListener()
    {

        public void onClick(View v)
        {                        
           // Toast.makeText(getBaseContext(), 
             //       "Mercy audio file is being played", 
               //       Toast.LENGTH_LONG).show();

            if (status==true)
            {
                mp.stop();
                mp.release();
                status = false;

            } 
            else
            {
            mp = MediaPlayer.create(iMEvil.this,R.raw.mercy); 


          //mp.start();

            try{
                mp.start();
                status= true; 
                //mp.release();
               }catch(NullPointerException e)
               {
                   Log.v("MP error",e.toString());
               }

            }

            mp.setOnCompletionListener(new OnCompletionListener(){ 

                   // @Override 
                   public void onCompletion(MediaPlayer arg0) { 
                      mp.release();
                      status = false;

                   } 
              }

          ); 



        }
    };
¿Fue útil?

Solución

Dos cosas:
1. Depurar el accidente y ver donde está fallando (qué línea).
2. Surround toda la declaración con un try / catch y simplemente coger un Excepción.

Si usted tiene una excepción o una mejor idea de dónde su código está fallando, entonces será mucho más fácil dar consejos sobre cómo solucionarlo ... como una cuestión de hecho, puede que ni siquiera necesita asesoramiento para fijar ella, usted podría terminar de resolver el problema por sí mismo y luego se va a cosechar los frutos de su propio éxito.

Actualización por los comentarios:
La documentación de MediaPlayer indica lo que podría ser el problema dado que los síntomas de la OP está viendo:

  

Para detener la reproducción, llame stop(). Si desea jugar de nuevo más tarde los medios de comunicación, a continuación,   debe reset() y prepare() el objeto antes de llamar MediaPlayer   start() nuevo. (Llamadas create() prepare() primera vez.)

Parece que si el botón de reproducción se pulsa demasiadas veces, entonces los medios de comunicación pueden llegar a no estar en el estado preparado y así arrojar alguna excepción. La idea de desactivar el botón de reproducción es válida y debe hacerse cargo de esta situación.

Aquí hay un código ilustrativo de lo que usted quiere que su programa para hacer:

private OnClickListener btnMercyListener = new OnClickListener()
{
    public void onClick(View v)
    {
        if(isPressed)
        {
            return;
        }

        isPressed = true;

        // create your media player
        mp = MediaPlayer.create(iMEvil.this,R.raw.mercy); 

        // set your listener
        mp.setOnCompletionListener(mp.setOnCompletionListener(new OnCompletionListener(){ 

            // @Override 
            public void onCompletion(MediaPlayer arg0) {
                    if(!isPressed)
                    {
                        return;
                    }

                    isPressed = false;

                    // re-enable your play button
                    playButton.enable();

                    // disable the pause button
                    pauseButton.disable();

                    mp.release();
                    mp.prepare();
                } 
            }
        );

        // disable the play button
        playButton.disable();

        // enable the pause button
        pauseButton.enable();

        // start playback
        mp.start();
    }
};

Por supuesto, usted debe tener las declaraciones try / catch apropiadas en ese país por lo que su aplicación no se bloquea, pero este código debe dar una idea general de qué hacer.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top