2010-04-22 4 views
1

J'ai ce problème, j'ai quelques audio que je veux jouer ...Arrêt et bouton Lecture Audio (Android)

et moi avons deux boutons pour elle, « Play » et « Stop » ...

Problème, après que j'appuie sur le bouton d'arrêt, puis appuyez sur le bouton Lecture, rien ne se passe. -Le bouton d'arrêt arrête la chanson, mais je veux le bouton Play pour jouer à nouveau la chanson (dès le début) Voici mon code:

final MediaPlayer mp = MediaPlayer.create(this, R.raw.megadeth); 

Et puis les deux onclicks publiques:

(Pour jouer ...)

button.setOnClickListener(new View.OnClickListener() { 
      public void onClick(View v) { 
       // Perform action on click 
      button.setText("Playing!"); 
      try { 
    mp.prepare(); 
    } catch (IllegalStateException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 
      mp.start(); 
      // 
      } 
     }); 

Et pour arrêter la piste ...

final Button button2 = (Button) findViewById(R.id.cancel); 
    button2.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 

     mp.stop(); 
     mp.reset(); 

     } 
    }); 

quelqu'un peut-il voir l'esprit de problème h cela? Si oui pourriez-vous s'il vous plaît fixer ... (pour suggérer)

Merci beaucoup ...

James

+0

* Bouton de lecture fonctionne correctement, -première fois * Bouton d'arrêt fonctionne très bien, (À l'arrêt de l'audio) le problème de redémarrer l'audio =/-play bouton :( –

Répondre

1

Vous devez appeler prepare() ou preparAsync() avant start(). Voir le API for details (voir le diagramme d'état).

+0

Regardez ce que je mets ... 'mp.prepare' puis quelques ifs ... Puis 'mp.start' alors pourquoi ne fonctionne pas? –

+0

@ James Rattray: Modifiez la ligne qui lit 'mp.reset()' en 'mp.prepare()' dans votre code bouton2.Réinitialiser nécessite de réinitialiser la source de données et d'appeler à nouveau préparer - c'est de récupérer à partir d'une erreur – JRL

+0

Donc, pas mp. réinitialiser du tout? Juste mp.stop puis mp.prepare()? -Non ... cela ne fonctionne pas =/ –

0

C'est ce que j'ai dans mon programme. Il libère le lecteur multimédia chaque fois que j'utilise des sons différents chaque fois qu'il est appelé, mais cela devrait fonctionner comme une solution de rechange pour votre utilisation.

Création:

public MediaPlayer mp=null; 

Démarrage:

if (mp!=null){ 
      mp.reset(); 
      mp.release(); 
    } 
      mp = MediaPlayer.create(test.this, soundResource); 
      mp.start(); 

Arrêt:

 mp.stop(); 

Notez également que vous ne souhaitez pas utiliser la préparation parce que la méthode créer des appels déjà préparer pour vous (API REF).

1

Il y a un bug dans la documentation Android, en this page, il est dit que vous pourriez stop() une « ressource brute » MediaPlayer, puis rejouer juste en appelant reset() et prepare() avant d'appeler start() à nouveau. Cela ne fonctionne pas, comme vous l'avez remarqué.

Le problème est que reset() efface la source audio et revient à l'état initial, vous devez donc redéfinir la source de données. Malheureusement, vous ne pouvez pas définir une source de données "ressource brute", car il n'y a pas d'API pour cela à part create().

Je ne connais pas un moyen propre de résoudre ce problème. La façon de stealthcopter fonctionne très bien, mais elle est pénible pour votre design, car vous avez besoin du contexte de chaque appel start() :(et consiste à détruire et créer un objet complexe, qui a un prix pour les applications en temps réel comme les jeux ...

Une autre façon qui assure que le contexte ne sera nécessaire pour la création() appel, est d'arrêter le lecteur multimédia ainsi:

stop() 
prepare() 

mais si vous appelez start() maintenant, il ne sera pas redémarrer depuis le début. Vous pouvez appeler seekTo(0), mais le son aura un peu de bruit à partir de la position de lecture précédente.

Je continue d'enquêter là-dessus. Il doit y avoir un moyen propre et efficace d'arrêter et de redémarrer le mediaplayer lorsqu'il est créé sur une ressource brute ...

+0

Après la réinitialisation, MediaPlayer revient à l'état "inactif". J'ai regardé dans la page que vous avez donnée et je ne l'ai pas vue. Vous pouvez regarder cette page sur le diagramme d'état et voir où reset() vous obtenez :) http://developer.android.com/reference/android/media/MediaPlayer.html#State%20Diagram – talel