Domanda

Ho un pulsante che riproduce un file audio sul suo click ascoltatore. Se il pulsante viene premuto di nuovo e di nuovo, mentre il file audio viene riprodotto poi l'applicazione si blocca. Qual è la soluzione?

Ecco il codice di riferimento:

 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;

                   } 
              }

          ); 



        }
    };
È stato utile?

Soluzione

Due cose:
1. Debug l'incidente e vedere dove è mancata (quale linea).
2. Surround l'intera dichiarazione con un try / catch e semplicemente prendere un eccezione.

Se si dispone di un'eccezione o una migliore idea di dove il codice non riesce, allora sarà molto più facile dare consigli su come risolvere il problema ... come un dato di fatto, si potrebbe anche non avere bisogno di consigli per risolvere esso, si potrebbe finire per risolvere il problema da soli e poi si raccoglieranno i frutti del proprio successo.

Aggiornamento per commenti:
La documentazione per MediaPlayer indica ciò che potrebbe essere il problema dato i sintomi del PO è vedere:

  

Per interrompere la riproduzione, chiamare stop(). Se si desidera riprodurre in seguito i media, poi   è necessario reset() e prepare() l'oggetto MediaPlayer prima di chiamare   start() di nuovo. (Chiamate create() prepare() la prima volta).

Sembra che se il tasto play viene premuto troppe volte, allora i media possono finire per non essere in stato preparato e quindi gettare un po 'un'eccezione. L'idea di disattivare il tasto play è valido e dovrebbe occuparsi di questa situazione.

Ecco il codice illustrativo su ciò che si desidera che il programma di fare:

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

Ovviamente si deve avere le istruzioni try / catch appropriate in là in modo la vostra applicazione non va in crash, ma questo codice dovrebbe darvi un'idea generale di cosa fare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top