Question

J'ai un bouton qui joue un fichier audio sur son écouteur de clic. Si le bouton est cliqué encore et encore alors que le fichier audio est en cours de lecture puis les application se bloque. Quelle est la solution?

Voici un code de référence:

 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;

                   } 
              }

          ); 



        }
    };
Était-ce utile?

La solution

Deux choses:
1. Debug l'accident et voir où il est défaillant (quelle ligne).
2. Surround toute la déclaration avec un try / catch et simplement attraper un d'exception.

Si vous avez une exception ou une meilleure idée où votre code échoue, alors il sera beaucoup plus facile de vous donner des conseils sur la façon de le réparer ... En fait, vous pourriez même pas besoin de conseils pour fixer , vous pourriez finir par résoudre le problème par vous-même et vous récolterez les fruits de votre propre succès.

Mise à jour par les commentaires: La documentation MediaPlayer indique ce qui pourrait être le problème étant donné les symptômes de l'OP est de voir:

  

Pour arrêter la lecture, appelez stop(). Si vous souhaitez rejouer plus tard les médias, puis   vous devez reset() et prepare() l'objet MediaPlayer avant d'appeler   start() à nouveau. (Appels create() prepare() la première fois.)

On dirait que si le bouton de lecture est pressé trop de fois, puis les médias peuvent finir par ne pas être dans l'état préparé et jeter ainsi une exception. L'idée de désactiver le bouton de lecture est valide et il doit prendre soin de cette situation.

Voici un code d'illustration de ce que vous voulez que votre programme à faire:

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

Bien sûr, vous devriez avoir les déclarations try / catch appropriées là-dedans pour que votre application ne tombe pas en panne, mais ce code devrait vous donner une idée générale de ce qu'il faut faire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top