Frage

Ich habe eine Schaltfläche, die eine Audiodatei auf dem Klick Zuhörer spielt. Wenn Sie die Taste erneut angeklickt wird und wieder, während die Audio-Datei, die gespielt wird, dann stürzt die App. Was ist die Lösung?

Hier ist ein Code als Referenz:

 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;

                   } 
              }

          ); 



        }
    };
War es hilfreich?

Lösung

Zwei Dinge:
1. Debug der Absturz und sehen, wo es versagt (die Linie).
2. Surround der ganze Aussage mit einem try / catch und einfach ein Ausnahme .

Wenn Sie eine Ausnahme oder eine bessere Idee haben, wo Ihr Code ausfällt, dann wird es viel einfacher sein, Ihnen Ratschläge, wie es zu beheben ... wie in der Tat, Sie könnten nicht einmal benötigen Beratung fix es, könnte man das Problem selbst zu lösen am Ende und dann werden Sie die Früchte Ihrer eigenen Erfolg ernten.

Update pro Kommentar:
Die Dokumentation für Mediaplayer zeigt an, was sein könnte das Problem der Symptome gegeben, die OP ist zu sehen:

  

Zum Stoppen der Wiedergabe Anruf stop(). Wenn Sie möchten später die Medien wiedergeben, dann   Sie müssen das Objekt reset() prepare() und MediaPlayer vor dem Aufruf   start() wieder. (create() Anrufe prepare() das erste Mal.)

Es sieht aus wie wenn die Play-Taste zu oft gedrückt wird, dann können die Medien nicht in dem vorbereiteten Zustand am Ende werden und somit eine Ausnahme aus. Die Idee der Deaktivierung der Play-Taste ist gültig und es sollte diese Situation kümmern.

Hier einige illustrative Code auf, was Sie wollen Ihr Programm zu tun:

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

Natürlich sollten Sie die entsprechenden try / catch-Anweisungen haben dort so Ihre App nicht abstürzen wird, aber dieser Code sollten Sie eine allgemeine Vorstellung von dem, was zu tun ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top