2009-05-22 7 views
7

Ich benutze eine MediaPlayer-Instanz, um Audiodateien von einem Internet-Ort zu streamen. Der Audio-Player befindet sich in einer separaten Aktivität. Der Benutzer kann aus einer Liste von Audiodateien auswählen und zu dieser Aktivität kommen, um den Ton abzuspielen.Android - finde heraus, ob Audio gerade abgespielt wird und stoppe ihn

Nun könnte der Benutzer zur vorherigen Aktivität (mit der Liste) zurückkehren und eine andere Audiodatei auswählen. In diesem Fall möchte ich alle anderen Audiodateien stoppen und mit der Wiedergabe des ausgewählten neuen Audiomaterials beginnen.

Kann ich irgendwie wissen, ob eine Audiodatei abgespielt wird, ohne das MediaPlayer-Objekt festhalten zu müssen?

Danke.

bearbeiten

ich fand heraus, wie zu wissen, ob ein Audio abgespielt wird. Wir können es tun, indem Sie ein Objekt von AudioManager verwenden und isAudioPlaying() aufrufen. Dadurch wird ein True wiedergegeben, wenn Audio wiedergegeben wird.

Jetzt die andere Frage, Wie höre ich eine Audio-Wiedergabe gerade auf? Ich habe keine Instanz des MediaPlayer-Objekts, das zum Starten der Audiodatei erstellt wurde (weil der Benutzer die Aktivität bereits einmal verlassen hat und mit einem neuen Objekt der Aktivität und somit einer neuen Instanz des MediaPlayers zurückgekehrt ist)

Antwort

10

Sie müssen stop() auf der MediaPlayer Instanz aufrufen. Um diese Arbeit in Ihrer Anwendung vornehmen, müssen Sie entweder auf:

  • Anruf stop() innerhalb der Audio-Wiedergabe-Aktivität (in onDestroy()), beispielsweise
  • ein Service Erstellen Sie Audio zu spielen und kommunizieren mit ihm aus beide Aktivitäten

eine Service arbeitet Ihr Code läuft außerhalb des Aktivitätslebenszyklus fortzusetzen, und ist der einzige Weg, um eine MediaPlayer Objekt bestehen bleiben, wie Sie in diesem Fall müssen.

Alternativ können Sie möglicherweise eine benutzerdefinierte Unterklasse von Application erstellen und die MediaPlayer dort speichern, aber eine Service gilt als bessere Praxis.

+0

Dank. Wäre es besser, einen Dienst, eine statische Variable oder eine Singleton-Klasse zu verwenden? Was wäre die bessere Designoption? – lostInTransit

2

Hier ist ein handliches Code zu schlafen, bis Audio-Wiedergabe erfolgt:

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

das tut nichts und jemand wird es kaum nützlich machen – sandalone

2

@lostintransit „Wäre es besser, einen Dienst zu verwenden, eine statische Variable oder eine Singletonklasse Was die bessere Design-Option wäre "

Ich denke, ein Service ist, was Sie wollen. Der integrierte Media Player und die Pandora App verwenden beide einen Dienst, um sicherzustellen, dass die Musik nicht an den Aktivitätszyklus gebunden ist.

Wenn ich verstehe, warum Sie ein Singleton oder statische verwenden würde, glaube ich nicht, dass es erreichen wird, was Sie wollen. Singleton/Static wird nur in einem einzigen Prozess in Linux erzwungen. Wenn Sie Ihre Aktivität starten, sie schließen und dann erneut starten, werden sie in verschiedenen Prozessen ausgeführt.

1

Versuchen Sie dies ...

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

Wo MP1 ist die MediaPlayer

+1

Dies wird nicht funktionieren, wenn mp1 Objekt beim Schließen der App zerstört wurde. – sandalone

1

I Weg gefunden, um zu überprüfen, ob Audio-Stream (AudioManager.STREAM_RING, AudioManager.STREAM_NOTIFICATION und etc.) ist derzeit damit beschäftigt mit Reflexion:

/** 
* 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; 
} 
Verwandte Themen