2009-05-22 4 views
7

J'utilise une instance de MediaPlayer pour diffuser des fichiers audio à partir d'un emplacement Internet. Le lecteur audio est dans une activité distincte. L'utilisateur peut choisir parmi une liste de fichiers audio et venir à cette activité pour lire l'audio.Android - recherche si l'audio est en cours de lecture et l'arrêter

Maintenant, l'utilisateur peut revenir à l'activité précédente (avec la liste) et sélectionner un autre fichier audio. Dans ce cas, je veux arrêter tout autre audio en cours de lecture et commencer à jouer le nouvel audio qui a été sélectionné.

Est-il possible de savoir si un fichier audio est en cours de lecture sans avoir à conserver l'objet MediaPlayer?

Merci.

Modifier

Je ne trouve comment savoir si un audio joue. Nous pouvons le faire en utilisant un objet de AudioManager et en appelant isAudioPlaying(). Cela retournera un vrai si n'importe quel audio joue.

Maintenant, l'autre question, comment arrêter un audio en cours de lecture? Je n'ai pas d'instance de l'objet MediaPlayer qui a été créé pour démarrer l'audio (car l'utilisateur a déjà quitté l'activité une fois et revient avec un nouvel objet de l'activité et donc une nouvelle instance de MediaPlayer)

Répondre

10

Vous devez appeler stop() sur l'instance MediaPlayer. Pour faire ce travail dans votre application, vous devez soit:

  • Appel stop() au sein de l'activité de lecture audio (en onDestroy()), par exemple
  • Créer un Service pour la lecture audio, et de communiquer avec elle de les deux activités

l'utilisation d'un Service permettra à votre code pour continuer à fonctionner en dehors du cycle de vie d'activité, et est la seule façon de persister un objet MediaPlayer comme vous devez dans ce cas.

Vous pouvez également créer une sous-classe personnalisée de Application et y enregistrer la MediaPlayer, mais l'utilisation d'une Service est considérée comme une meilleure pratique.

+0

Merci. Serait-il préférable d'utiliser un service, une variable statique ou une classe singleton? Quelle serait la meilleure option de conception? – lostInTransit

2

est ici un code pratique pour dormir jusqu'à ce que l'audio est fini de jouer:

AudioManager manager = (AudioManager)this.getSystemService(Context.AUDIO_SERVICE); 
    while(manager.isMusicActive()) 
    { 
     Log.d("music", "music is active"); 
     try 
     { 
      Thread.sleep(500); 
     } 
     catch (InterruptedException e) 
     { 
      Log.e("music", "interrupted waiting for music to stop"); 
     } 
     Log.d("music", "done playing music"); 
    } 
+1

cela ne fait rien et quelqu'un ne le rendra guère utile – sandalone

2

@lostintransit « Serait-il préférable d'utiliser un service, une variable statique ou une classe singleton Quelle serait la meilleure option de conception ? "

Je pense qu'un service est ce que vous voulez. Le lecteur multimédia intégré et l'application de Pandora utilisent tous les deux un service pour s'assurer que la musique n'est pas liée au cycle de vie de l'activité.

Si je comprends pourquoi vous utiliseriez un singleton ou statique, je ne pense pas qu'il accomplira ce que vous voulez. Le singleton/static ne sera appliqué que dans un seul processus sous Linux. Si vous lancez votre activité, fermez-la, puis relancez-la, elle fonctionnera dans différents processus.

1

Essayez ceci ...

if (mp1 != null && mp1.isPlaying()) { 
       mp1.stop(); 
      } 

Où MP1 est le MediaPlayer

+1

Cela ne fonctionnera pas si l'objet mp1 a été détruit lors de la fermeture de l'application. – sandalone

1

J'ai trouvé moyen de vérifier si le flux audio (AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION et etc.) est actuellement occupé réflexion en utilisant:

/** 
* Unhide android api: check is stream is active now (AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION...), 
* uses reflection 
* @param audioStream 
* @return 
*/ 
public static boolean isStreamActive(int audioStream) { 
    Class<?> audioSystemClazz = null; 
    Boolean res = false; 
    try { 
     audioSystemClazz = Class.forName("android.media.AudioSystem"); 
     if (null != audioSystemClazz) { 
      // isStreamActive 
      Method method = audioSystemClazz.getDeclaredMethod("isStreamActive", new Class<?>[] { int.class, 
        int.class }); 
      if (null != method) { 
       res = (Boolean) method.invoke(null, audioStream, 0); 
      } 
     } 
    } catch (ClassNotFoundException e) { 
     e.printStackTrace(); 
    } catch (NoSuchMethodException e) { 
     e.printStackTrace(); 
    } catch (IllegalAccessException e) { 
     e.printStackTrace(); 
    } catch (IllegalArgumentException e) { 
     e.printStackTrace(); 
    } catch (InvocationTargetException e) { 
     e.printStackTrace(); 
    } 

    return res; 
} 
Questions connexes