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