web-dev-qa-db-fra.com

Android MediaPlayer Stop and Play

Je crée Android contient 2 boutons, en cliquant sur chaque bouton, lire un fichier mp3. Le problème est que lorsque je joue button1 Il joue sound1, lorsque je clique sur button2, il lit sound2.

Je vérifie sur chaque bouton l'autre joueur s'il fonctionne et je l'arrête et joue celui cliqué

Mais si je clique deux fois sur le même bouton, la première piste audio est lue en arrière-plan et j'en rejoue une autre

J'ai essayé de vérifier isPlaying() et de l'arrêter, mais cela ne fonctionne pas!

Je veux Si je clique sur button1, Il joue sound1 Et si on clique dessus, il l'arrête et le rejoue depuis le début.

Mon code:

package com.hamoosh.playaudio;
import Android.app.Activity;
import Android.media.MediaPlayer;
import Android.media.MediaPlayer.OnCompletionListener;
import Android.os.Bundle;
import Android.os.Handler;
import Android.view.View;
import Android.widget.Button;
import Android.widget.TextView;

public class PlayaudioActivity extends Activity {
/** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button b= (Button) findViewById(R.id.button1);
        Button b2= (Button) findViewById(R.id.button2);
        final TextView t= (TextView) findViewById(R.id.textView1);

        final MediaPlayer mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
        final MediaPlayer mp1 = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);

        b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mp1.isPlaying()) {

                    mp1.stop();
                }

                mp.start();
            }

        });

        b2.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (mp.isPlaying()) {

                    mp.stop();
                }
                mp1.start();
            }
        });
    }
}

J'espère qu'il y a un meilleur code qui peut utiliser plusieurs boutons comme un tableau ou quelque chose pour ne pas vérifier chaque bouton et chaque joueur à chaque fois.

25
Mohammad Hammad

Vous ne devez utiliser qu'un seul objet mediaplayer

    public class PlayaudioActivity extends Activity {

        private MediaPlayer mp;

        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Button b = (Button) findViewById(R.id.button1);
            Button b2 = (Button) findViewById(R.id.button2);
            final TextView t = (TextView) findViewById(R.id.textView1);

            b.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    stopPlaying();
                    mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.far);
                    mp.start();
                }

            });

            b2.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View v) {
                    stopPlaying();
                    mp = MediaPlayer.create(PlayaudioActivity.this, R.raw.beet);
                    mp.start();
                }
            });
        }

        private void stopPlaying() {
            if (mp != null) {
                mp.stop();
                mp.release();
                mp = null;
           }
        }
    }
51
Mario

Pour arrêter le lecteur multimédia sans risque d'exception d'état illégal, vous devez effectuer

  try {
        mp.reset();
        mp.prepare();
        mp.stop();
        mp.release();
        mp=null;
       }
  catch (Exception e)
         {
           e.printStackTrace();
         }

plutôt que juste

try {
       mp.stop();
       mp.release();
       mp=null;
    } 
catch (Exception e) 
    {
      e.printStackTrace();
    }
6
Ruchir Baronia

Selon le cycle de vie MediaPlayer, que vous pouvez voir dans le Guide de l'API Android , je pense que vous devez appeler reset() au lieu de stop(), puis préparez à nouveau le lecteur multimédia (n'en utilisez qu'un) pour lire le son depuis le début. Tenez également compte du fait que le son est peut-être terminé. Je recommanderais donc également d'implémenter setOnCompletionListener() pour vous assurer que si vous essayez de reproduire le son, il n'échouera pas.

4
Javier

juste au cas où quelqu'un viendrait à cette question, j'ai la version la plus simple.

public static MediaPlayer mp;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button b = (Button) findViewById(R.id.button);
        Button b2 = (Button) findViewById(R.id.button2);


        b.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mp = MediaPlayer.create(MainActivity.this, R.raw.game);
                mp.start();
            }
        });

        b2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mp.stop();
               // mp.start();
            }
        });
    }
0
dyingStudent