Pergunta

Eu tenho um botão que reproduz um arquivo de áudio em seu ouvinte de clique. Se o botão for clicado repetidamente enquanto o arquivo de áudio estiver sendo reproduzido, o aplicativo trava. Qual é a solução?

Aqui está algum código para referência:

 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;

                   } 
              }

          ); 



        }
    };
Foi útil?

Solução

Duas coisas:
1. Depure o acidente e veja onde está falhando (qual linha).
2. cercada toda a declaração com uma tentativa/pegada e simplesmente pegue um Exceção.

Se você tiver uma exceção ou uma ideia melhor em que seu código está falhando, será muito mais fácil dar conselhos sobre como consertá -lo ... de fato, talvez você nem precise de conselhos para corrigi -lo, você Pode acabar resolvendo o problema sozinho e você colherá os frutos de seu próprio sucesso.

Atualização por comentários:
A documentação para Reprodutor de mídia indica qual pode ser o problema, considerando os sintomas que o OP está vendo:

Para parar a reprodução, ligue stop(). Se você deseja reproduzir mais tarde a mídia, então você deve reset() e prepare() a MediaPlayer objeto antes de ligar start() novamente. (create() chamadas prepare() a primeira vez.)

Parece que, se o botão de reprodução for pressionado muitas vezes, a mídia pode acabar não estar no estado preparado e, assim, lançar alguma exceção. A idéia de desativar o botão de reprodução é válida e deve cuidar dessa situação.

Aqui está algum código ilustrativo sobre o que você deseja que seu programa faça:

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

É claro que você deve ter as instruções de tentativa/captura apropriadas lá para que seu aplicativo não trava, mas esse código deve fornecer uma idéia geral do que fazer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top