MediaPlayer start() und stop() probleme

  • Antworten:7
Michele
  • Forum-Beiträge: 1.525

27.06.2012, 03:51:46 via Website

Hallo alle zusammen :).

Ich habe irgendwie ein problem mit dem MediaPlayer.
Mit meinem Button will ich die Musik an und aus schalten können.

Er starten wie geschrieben die Musik dann mit "mp.start();"
Und stopen tut er auch wie geschrieben mit "mp.start();"

Aber wenn ich die Musik nun wieder starten will passiert nichts und im Log kommt diese fehler meldung.
106-27 00:41:56.917: E/MediaPlayer(554): start called in state 64
206-27 00:41:56.922: E/MediaPlayer(554): error (-38, 0)
306-27 00:41:56.922: E/MediaPlayer(554): Error (-38,0)

Komisch ist das es mit der "mp.pause();" klappt.


LG

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

27.06.2012, 08:51:20 via Website

Ja, ja, der MediaPlayer. Der ist ganz empfindlich wenn man von ihm Dinge in falscher Reihenfolge verlangt.

Wichtig ist auf jeden Fall den onPrepared() abzuwarten bevor man den mediaPlayer.start() ausführt. Schau Dir mal den Ablauf Deiner Befehle an den MediaPlayer an. Ich habe mir schon häufiger die restlichen Haare ausgerauft weil der MediaPlayer immer mit irgendwelchen undokumentierten Returncodes daherkommt. Die leider notwendige Beschäftigung mit dem Ablaufplan auf dieser Seite hat mir immer geholfen:

http://developer.android.com/reference/android/media/MediaPlayer.html

Auch wenn es widersinnig erscheint - ich habe die ganze Palette der Listener implementiert nur um den Status auch ganz genau zu wissen:

1public class MyService extends Service implements OnBufferingUpdateListener, OnCompletionListener, OnErrorListener, OnInfoListener, OnPreparedListener

In jedem Callback merke ich mir den eintreffenden Status damit ich auch ganz genau weiß in welchem Status der MediaPlayer sich befindet (ich vertraue den MediaPlayer Statusabfragen nicht mehr). Und nach einem onError geht sowieso nix mehr ;-)

Also, guck mal genau in den Ablauf Deiner Befehle.

Michele

Antworten
Michele
  • Forum-Beiträge: 1.525

27.06.2012, 22:17:17 via Website

Hallo ihr lieben.

Ich danke euch. Es dauert leider bei mir bisschen länger immer bis ich was oder das verstehe.
Ich weiß auch nicht warum.

Aber ok ich habe es hin bekommen mit:

1try {
2 mp.prepare();
3 } catch (IllegalStateException e) {
4 // TODO Auto-generated catch block
5 e.printStackTrace();
6 } catch (IOException e) {
7 // TODO Auto-generated catch block
8 e.printStackTrace();
9 }
10 mp.start();
11
12
13und dann später mp.stop();

Nur das lustige ist daran...Es ist wie mp.pause();
Wenn ich dann wieder mp.start(); mache dann spiel er da weiter wo er aufgehört hat.
Aber ich denke da fehlt noch was =). Ich teste weiter.

LG

— geändert am 27.06.2012, 22:17:58

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

28.06.2012, 11:04:33 via Website

* Ich sehe gerade das Du "mp.prepare()" verwendest. In dem Fall musst Du nicht auf "onPrepared()" warten. Ich hatte das bei Dir nicht gesehen. Ich nutze immer "prepareAsync()" da meine MediaPlayer Services fast immer sowohl fürs Web Streaming als auch fürs lokale Abspielen genutzt werden. In dem Fall muss ich auf den "onPrepared()" warten.

* Frage: Was passiert wenn Du "mp.seekTo(0)" vor dem "mp.start()" einfügst? Ich habe das zwar noch noch nie benötigt - es wäre aber mal einen Versuch wert.

Michele

Antworten
Michele
  • Forum-Beiträge: 1.525

28.06.2012, 18:02:08 via Website

Ich danke dir.

Ich bin echt doof.
Mit seekTo(); dazu hilft es. Ich frage mich echt warum ich nicht gleich darauf gekommen bin *grins*.
seekTo(0); <<< fängt dann bei der 0msec an. Also von vorne einfach so wie ich das verstehe.

So sieht es nun aus und es klappt super alles:
1if (musikoff) {
2 try {
3 mp.prepare();
4 } catch (IllegalStateException e) {
5
6 e.printStackTrace();
7 } catch (IOException e) {
8
9 e.printStackTrace();
10 }
11 mp.seekTo(0);
12 mp.start();
13
14 musikoff = false;
15 } else {
16
17 mp.stop();
18
19 musikoff = true;
20 }




LG

— geändert am 28.06.2012, 18:02:46

Antworten
Gelöschter Account
  • Forum-Beiträge: 694

28.06.2012, 18:04:39 via Website

Prima das es läuft. Aber eigentlich sollte es auch ohne gehen ...

Na ja, man muss nicht alles verstehen ;-)


Nachtrag: Die musikoff Setzerei kannst Dur Dir sparen wenn Du die Funktion isPlaying() verwendest. Alternativ könntest Du die oben von mir erwähnten Listener implementieren und so einen detaillierten Zustand des MediaPlayers mitprotokollieren.

— geändert am 28.06.2012, 18:07:55

Michele

Antworten
Michele
  • Forum-Beiträge: 1.525

28.06.2012, 18:12:36 via Website

Ja danke dir =)

Ja das teste ich auch mal :). Umso mehr ich weiß/teste umso besser :)

Aber trotzdem nochmal vielen danke dir und euch. :)



LG

— geändert am 28.06.2012, 18:12:54

Antworten