web-dev-qa-db-fra.com

Lecteur multimédia start start start

Je fais une nouvelle application sonore Android. J'ai créé un bouton cliquable pour reproduire le son lorsque je clique dessus. Mais je veux aussi que le son cesse de jouer lorsque je clique pour la deuxième fois. Le problème est que cette partie fonctionne bien maintenant. Lorsque je clique à nouveau sur le bouton pour reproduire le son, il ne le lit pas, le lecteur multimédia est complètement arrêté. Je cherchais sur les forums mais je n'arrive pas à trouver une réponse qui pourrait m'aider. Voici mon activité:

  MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prvi);

    final MediaPlayer mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
    final MediaPlayer mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);


    Button dugme = (Button) findViewById(R.id.dugme);
    dugme.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mpButtonClick1.isPlaying()) {
                mpButtonClick1.stop();
                mpButtonClick1.reset();

            }
            else {              
                mpButtonClick1.start();

            }


        }   

    });

Lorsque j'essaie d'écrire mpButtonClick1.prepare (); J'obtiens une exception d'exception non gérée Exception de type IOE

12
Slim C.

Changez votre classe avec le code ci-dessous:

supprimer reset();.

bien initier tous les composants:

MediaPlayer mpButtonClick1;
MediaPlayer mpButtonClick2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.prvi);

     mpButtonClick1 = MediaPlayer.create(this, R.raw.spalshm);
     mpButtonClick2 = MediaPlayer.create(this, R.raw.splashs);


    Button dugme = (Button) findViewById(R.id.dugme);
    dugme.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            if (mpButtonClick1.isPlaying()) {
                mpButtonClick1.stop();
             }
            else {              
                mpButtonClick1.start();
            }
         }   

    });
3
Bhoomika Brahmbhatt

Essayez d’utiliser pause au lieu de stop.

Raison: si vous mettez en pause la MediaPlayer, vous pourrez la reprendre plus tard. Toutefois, si vous utilisez stop, pratiquement aucune autre méthode ne fonctionnera et vous devrez préparer à nouveau le MediaPlayer (ou en créer un nouveau).

enter image description here

Plus d'infos: ici et ici

PS: n'oubliez pas de libérer la mémoire lorsque vous avez fini d'utiliser les ressources.

9
gian1200

Essayez ceci: vous ne devriez 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;
       }
    }
}
7
Shylendra Madda

Une solution simple consiste à utiliser la pause au lieu de stop et la recherche au début de la chanson.

0
automaticSoldier

Dans mon expérience, lorsque je dois jouer plusieurs fois et que je dois arrêter une partie pour en commencer une autre (comme dans le cas de plusieurs boutons), je crée simplement un autre joueur en m'assurant de libérer les ressources du précédent. . Pour arrêter simplement utiliser

mediaPlayer.stop(); 

Mais pour jouer, utilisez quelque chose comme ceci (adaptez la journalisation à vos besoins spécifiques) pour créer/recréer votre lecteur:

private boolean createMediaPlayer()
{
    if (mediaPlayer!=null)
    {
        if(mediaPlayer.isPlaying())
        {
            mediaPlayer.stop();
            mediaPlayer.reset();
            mediaPlayer.release();
            mediaPlayer=null;
        }

    }
    mediaPlayer = new MediaPlayer();
    mediaPlayer.setVolume(1f, 1f);
    try
    {
        mediaPlayer.setAudioStreamType(Interop.PRIMARY_STREAM);
        mediaPlayer.setDataSource(m_soundFile);
        mediaPlayer.prepare();
        return true;
        // Interop.logDebug(TAG + "-loadAudio: SUCCESS" + m_soundFile);
    } catch (Exception e)
    {
        Interop.logError(TAG + "-LoadAudio for Clic Sound: audioPlayer prepare failed for current file: " + m_soundFile);
        Interop.logError(TAG + "-Exception: " , e);
        return false;
    }
}

et que l'utilisation

if (createMediaPlayer())
    mediaPlayer.start();

cela garantira la libération appropriée des ressources utilisées par le lecteur multimédia.

0
Gogu CelMare

Vous appelez mpButtonClick1.reset () après mpButtonClick1.stop () - ne le faites pas:

if (mpButtonClick1.isPlaying()) {
    mpButtonClick1.stop();
    mpButtonClick1.reset(); //<--------- calling reset(), remove this line
}

Les docs pour reset () say:

Réinitialise le MediaPlayer à son état non initialisé. Après avoir appelé cette méthode, vous devrez l'initialiser à nouveau en définissant la source de données et en appelant la méthode prepare ().

Supprimez mpButtonClick1.reset () et cela devrait fonctionner.

N'oubliez pas que MediaPlayer fonctionne comme une machine à états, ce qui signifie que si vous appelez des méthodes dans le mauvais ordre, vous rencontrerez des problèmes. Veuillez lire à propos de MediaPlayer ici et ici .

0
Melquiades

Je sais que cette question est assez ancienne, mais récemment, lors de l'apprentissage d'Android, je me suis également retrouvé coincé à ce stade et j'ai trouvé une solution très simple que j'aimerais partager avec tout le monde.

Au lieu d'essayer d'arrêter ou de réinitialiser le support, vous pouvez simplement rechercher en arrière vers la position de départ .

mediaPlayer.seekTo(0);

Pour référence, je publie également mon code ci-dessous:

public class MainActivity extends AppCompatActivity {

    MediaPlayer mp;

    public void play(View view) {
        mp.start();
    }

    public void pause(View view) {
        mp.pause();
    }

    public void stop(View view) {
        // this seeks to the beginning of the file
        mp.seekTo(0);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mp = MediaPlayer.create(this, R.raw.sample_audio);
    }
}
0
av-sharma