Ich versuche gerade, eine einfache App zu entwerfen, die einen Internetradiosender streamt. Ich habe die URL für den Sender und richte den Media Player wie ein
MediaPlayer mediaPlayer = new MediaPlayer();
try {
mediaPlayer.setDataSource(URL);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
try {
mediaPlayer.prepare();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mediaPlayer.start();
Das Programm stürzt beim Emulieren nicht ab, aber es wird nichts abgespielt und ich erhalte die folgende Fehlermeldung:
start called in state 0
und direkt darunter ist es
Error (-38,0)
Weiß jemand was das bedeutet?
Ich habe ein wenig über diese Statusfehler gelesen, konnte aber nichts finden, was für mein Projekt gilt.
android
android-mediaplayer
SmashCode
quelle
quelle
Antworten:
Sie müssen
mediaPlayer.start()
dieonPrepared
Methode mithilfe eines Listeners aufrufen . Sie erhalten diesen Fehler, weil Sie anrufen,mediaPlayer.start()
bevor der vorbereitete Status erreicht ist.So können Sie es machen:
quelle
Es scheint, als ob Fehler -38 eine Statusausnahme bedeutet (wie die Fehlermeldung anzeigt). Zum Beispiel, wenn Sie anrufen
start()
, bevor das Lied fertig war, oder wenn Sie anrufenpause()
, auch wenn das Lied überhaupt nicht abgespielt wird.Um dieses Problem zu beheben, überprüfen Sie den Status des mediaPlayer, bevor Sie die Methoden aufrufen. Beispielsweise:
Zusätzlich sendet der MediaPlayer Ereignismeldungen. Auch wenn Sie das vorbereitete Ereignis nicht benötigen (obwohl es eine gute Idee wäre, die Wiedergabe nicht zu starten, bevor dieses Ereignis ausgelöst wurde), müssen Sie einen Rückruf-Listener festlegen. Dies gilt auch für die
OnErrorListener
,OnCompletionListener
,OnPreparedListener
undOnSeekCompletedListener
(wenn Sie die Suchmethode aufrufen).Zuhörer können einfach von angehängt werden
quelle
Ich habe diesen Fehler erhalten, als ich versucht habe, die aktuelle Position (MediaPlayer.getCurrentPosition ()) des Media Players abzurufen, wenn diese nicht in der angegebenen Position enthalten war. Ich habe dies umgangen, indem ich den Status verfolgt und die Methode getCurrentPosition () erst aufgerufen habe, nachdem onPreparedListener aufgerufen wurde.
quelle
Dies ist mein Code, getestet und funktioniert gut:
quelle
Ich habe unten Code getestet. funktioniert gut
quelle
SetAudioStreamType(..)
verwendenSetAudioAttributes(...)
Ich bin vor einigen Tagen auf dasselbe Problem gestoßen. Mein Audio-MediaPlayer funktioniert einwandfrei auf Geräten mit hoher Verarbeitungsleistung, aber bei langsamen Geräten hat der Mediaplayer einige Zeit nicht abgespielt, und von LogCat haben sich viele darüber beschwert, dass er im falschen Zustand angerufen wurde. Also habe ich es gelöst, indem ich den Aufruf von start () , pause () , ... in der onPrepared () -Methode von OnPreparedListener () wie folgt aufgerufen habe :
Versuchen Sie auch, einen Media Player freizugeben, den Sie nicht mehr benötigen. Zum Beispiel, wenn Sie die Audio- oder Video - on - Hintergrund nicht spielen wollen , dann sollten Sie rufen mediaPlayer.release () in onPause () .
quelle
Manchmal werden Dateien so codiert, dass Android sie nicht dekodieren kann. Auch einige mp4-Dateien können nicht abgespielt werden. Bitte versuchen Sie es mit einem anderen Dateiformat (.3gp werden die meiste Zeit abgespielt) und sehen Sie ..
quelle
über dem Bild können Sie den richtigen Weg finden.
quelle
Sie erhalten diese Nachricht in den Protokollen, weil Sie etwas tun, das im aktuellen Status Ihrer MediaPlayer-Instanz nicht zulässig ist.
Daher sollten Sie immer einen Fehlerbehandler registrieren, um diese Dinge abzufangen (wie von @tidbeck vorgeschlagen).
Zunächst rate ich Ihnen, sich die Dokumentation für die
MediaPlayer
Klasse anzusehen und zu verstehen, was dies mit Zuständen bedeutet. Siehe: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagramIhr Fehler hier könnte durchaus einer der häufigsten sein, die anderen hier geschrieben haben, aber im Allgemeinen würde ich mir die Dokumentation ansehen, welche Methoden in welchem Zustand zum Aufrufen gültig sind: http://developer.android.com/ Referenz / android / media / MediaPlayer.html # Valid_and_Invalid_States
In meinem Beispiel war es die Methode
mediaPlayer.CurrentPosition
, die ich aufgerufen habe, während sich der Media Player in einem Zustand befand, in dem diese Eigenschaft nicht aufgerufen werden durfte.quelle
Ich habe sowohl die Fehler (-19,0) als auch (-38,0) behoben, indem ich jedes Mal ein neues Objekt von MediaPlayer erstellt habe, bevor ich es abgespielt und danach wieder freigegeben habe.
Vor :
}}
Nach dem:
}}
quelle
quelle
Es war sehr frustriert. Also habe ich eine Lösung bekommen, die für mich funktioniert.
quelle
Bei mir hat das geklappt
quelle
Ich habe auch diesen Fehler bekommen, den ich mit onPreparedListener versucht habe, aber immer noch diesen Fehler. Endlich habe ich die Lösung gefunden, dass der Fehler meine Schuld ist, weil ich die Internetberechtigung in Android Manifest xml vergessen habe. :) :)
Ich habe Beispielcodierung für Mediaplayer verwendet. Ich habe in der StreamService.java-
onCreate
Methode verwendetquelle
Ich habe das gleiche Problem kurz zuvor getroffen, der Freund im ersten Stock hatte Recht, Sie haben den
start()
zur falschen Zeit angerufen , Sie sollten einen Listener für prepare () oderprepareSync()
mit dieser Methode einstellenmediaPlayer.setOnPreparedListener(this)
; vor der Vorbereitung in diesem Rückruf.start()
Es kann Ihr Problem lösen. Ich habe es schon versucht.quelle
Ich bin neu in der Android-Programmierung und hatte den gleichen Fehler wie dieser. Also habe ich einfach den mp.createmediaPlayer = MediaPlayer.create (getApplicationContext (), Settings.System.DEFAULT_RINGTONE_URI) neu definiert. Es ist vielleicht nicht der wahre Weg, es zu tun, aber es hat für mich mit einer Geldstrafe geahndet:
quelle
quelle