Obecnie próbuję zaprojektować prostą aplikację, która przesyła strumieniowo internetową stację radiową. Mam adres URL stacji i konfiguruję odtwarzacz multimedialny
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();
Program nie zawiesza się podczas emulacji, ale nic nie gra i pojawia się następujący błąd:
start called in state 0
a tuż poniżej jest
Error (-38,0)
Czy ktokolwiek wie, co to znaczy?
Czytałem trochę o tych błędach stanu, ale nie mogłem znaleźć niczego, co dotyczy mojego projektu.
android
android-mediaplayer
SmashCode
źródło
źródło
Odpowiedzi:
Trzeba zadzwonić
mediaPlayer.start()
wonPrepared
metodzie za pomocą detektora. Otrzymujesz ten błąd, ponieważ dzwonisz,mediaPlayer.start()
zanim osiągnie stan przygotowania.Oto jak możesz to zrobić:
źródło
Wygląda na to, że Błąd -38 oznacza wyjątek stanu (jak wskazuje komunikat o błędzie). Na przykład, jeśli zadzwonisz
start()
, zanim piosenka była gotowa lub gdy zadzwoniszpause()
, nawet jeśli piosenka w ogóle nie jest odtwarzana.Aby rozwiązać ten problem, sprawdź stan mediaPlayer przed wywołaniem metod. Na przykład:
Dodatkowo MediaPlayer wysyła komunikaty o zdarzeniach. Nawet jeśli nie potrzebujesz przygotowanego zdarzenia (chociaż dobrze byłoby nie rozpoczynać odtwarzania przed uruchomieniem tego zdarzenia), musisz ustawić odbiornik wywołań zwrotnych. Dotyczy to również dla
OnErrorListener
,OnCompletionListener
,OnPreparedListener
orazOnSeekCompletedListener
(jeśli nazywają poszukują metody).Słuchacze mogą być dołączani po prostu przez
źródło
Otrzymałem ten błąd, gdy próbowałem uzyskać bieżącą pozycję (MediaPlayer.getCurrentPosition ()) odtwarzacza multimedialnego, gdy nie było go w przygotowanym podanym. Obejrzałem ten problem, śledząc jego stan i wywołując metodę getCurrentPosition () dopiero po wywołaniu onPreparedListener.
źródło
Oto mój kod, przetestowany i działający dobrze:
źródło
przetestowałem poniższy kod. pracować w porządku
źródło
SetAudioStreamType(..)
użyciaSetAudioAttributes(...)
Kilka dni temu napotkałem ten sam problem. Mój odtwarzacz audio MediaPlayer działa dobrze na urządzeniach o dużej mocy obliczeniowej, ale w przypadku wolnych urządzeń odtwarzacz multimedialny po prostu nie grał przez jakiś czas, a od LogCat wiele narzekało, że został wywołany w złym stanie. Więc postanowiłem go nazywając oddanie wywołanie start () , pause () , ... w onPrepared () metody OnPreparedListener () jak poniżej:
Spróbuj także zwolnić dowolny odtwarzacz multimedialny, którego już nie potrzebujesz. Na przykład, jeśli nie chcesz odtwarzać dźwięku lub wideo w tle, powinieneś wywołać mediaPlayer.release () w onPause () .
źródło
Czasami plik jest kodowany w sposób, którego Android nie może zdekodować. Nie można odtworzyć nawet niektórych plików mp4. Spróbuj użyć innego formatu pliku (przez większość czasu odtwarzane są pliki .3gp) i zobacz ...
źródło
nad zdjęciem możesz uzyskać właściwą drogę.
źródło
Otrzymujesz ten komunikat w dziennikach, ponieważ robisz coś, co jest niedozwolone w obecnym stanie Twojej instancji MediaPlayer.
Dlatego zawsze powinieneś zarejestrować program obsługi błędów, aby wychwycić te rzeczy (jak sugerował @tidbeck).
Na początku radzę zapoznać się z dokumentacją
MediaPlayer
zajęć i zrozumieć, co to oznacza ze stanami. Zobacz: http://developer.android.com/reference/android/media/MediaPlayer.html#StateDiagramTwój błąd może być jednym z powszechnych, inni napisali tutaj, ale ogólnie przyjrzałbym się dokumentacji tego, jakie metody są ważne do wywołania w jakim stanie: http://developer.android.com/ reference / android / media / MediaPlayer.html # Valid_and_Invalid_States
W moim przykładzie była to metoda
mediaPlayer.CurrentPosition
, którą wywołałem, gdy odtwarzacz multimedialny był w stanie, w którym nie można było wywołać tej właściwości.źródło
Rozwiązałem zarówno błędy (-19,0), jak i (-38,0), tworząc za każdym razem nowy obiekt MediaPlayera przed rozpoczęciem odtwarzania i puszczając go później.
Przed :
}
Po:
}
źródło
źródło
To było bardzo sfrustrowane. Otrzymałem rozwiązanie, które mi odpowiada.
źródło
U mnie to zadziałało
źródło
Otrzymałem również ten błąd, który próbowałem z onPreparedListener, ale nadal mam ten błąd. W końcu otrzymałem rozwiązanie, że błąd jest moją winą, ponieważ zapomniałem uprawnienia do Internetu w pliku Android Manifest xml. :)
Użyłem przykładowego kodowania dla mediaplayera. Użyłem w metodzie StreamService.java
onCreate
źródło
Tuż przedtem spotkałem się z tym samym problemem, kolega na pierwszym piętrze miał rację, dzwoniłeś
start()
w złym czasie, należy ustawić słuchacza na przygotowanie () lubprepareSync()
tą metodąmediaPlayer.setOnPreparedListener(this)
; przed przygotowaniem, w tym wywołaniu zwrotnymstart()
. Może to rozwiązać Twój problem. Już próbowałem.źródło
Jestem nowy w programowaniu na Androida i miałem ten sam błąd co ten. więc po prostu przedefiniowałem mp.createmediaPlayer = MediaPlayer.create (getApplicationContext (), Settings.System.DEFAULT_RINGTONE_URI). Może to nie jest prawdziwy sposób, ale dla mnie zadziałało grzywną:
źródło
źródło