2012-03-07 19 views
45

Potrzebuję uzyskać czas trwania pliku audio dla serii komunikatów głosowych, które muszą być odtwarzane z aplikacji. Dodałem pliki audio jako zasoby i grają dobrze. Poniższy przykładowy kod działa idealnie do zamierzonego celu: zwraca czas trwania plików audio.Android: mediaplayer odszedł z nieobsłużonymi zdarzeniami

Oto kod:

float getDurationOfAudioResource(LocationEnum loc, Context context){ 
    float duration = 0; 
    try { 
     MediaPlayer mp; 
     mp = MediaPlayer.create(context, getAudioResource(loc)); 
     duration = mp.getDuration(); 
     mp.release(); 
     mp = null; 
    } 
    catch (IllegalStateException e) {e.printStackTrace(); logError(25, "TestDescItem:Fault::Could not open mediaplayer object with audio resource.");} 
    return duration; 
} 

Oto najdziwniejsze. Ten kod jest wywoływany w głównym działaniu, które przygotowuje zestaw instrukcji dźwiękowych dla danego testu. W ramach tego działania nie ma błędów. Ale zaraz po wywołaniu drugiej czynności otrzymuję długi ciąg błędów na logcat.

03-07 13:23:43.820: I/ActionLogger(21435): GenTest_Info_Test #0 successfully created. 
03-07 13:23:43.830: I/ActionLogger(21435): GenTest_Info_Test #1 successfully created. 
03-07 13:23:43.840: I/ActionLogger(21435): GenTest_Info_Test #2 successfully created. 
03-07 13:23:43.850: I/ActionLogger(21435): GenTest_Info_Test #3 successfully created. 
<snip> 
03-07 13:23:43.910: I/ActionLogger(21435): GenTest_Info_all tests successfully created. 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.260: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
03-07 13:23:47.270: W/MediaPlayer(21435): mediaplayer went away with unhandled events 
<snip> 

Mam jednoetapowy do końca głównego działania (bez błędów) i od pierwszego wiersza drugiego działania. Błędy zdecydowanie rzucają się między działania.
Ponadto, jeśli skomentuję osiem wierszy bloku try (zwracając tylko zero), zostaną usunięte błędy logcat. Kiedy przywracam osiem linii, błędy powracają. Przeszukałem dokumentację i przeszukałem sieć i uważam, że poprawnie konstruuję, zwalniam i niszczę obiekt mediaplayer, więc nie widzę powodu, dla którego otrzymuję błąd. To powiedziawszy, muszę zrobić coś złego. Jakieś pomysły?

Dzięki,

Kevin

Odpowiedz

160

Wystarczy umieścić mp.reset(); przed mp.release();.

+0

Doskonałe. To naprawiło to! Dziękuję Ci! – Hephaestus

+9

Co to oznacza? Wydanie – Casebash

+4

powoduje, że mój obraz wideo ulegnie awarii z IllegalStateException po tym ... – Ron

34

świętego pięciu:

if(mp!=null) { 
     if(mp.isPlaying()) 
      mp.stop(); 
     mp.reset(); 
     mp.release(); 
     mp=null; 
    } 
+2

Pracował jak wdzięk – locrizak

+0

Dla każdego używającego VideoView, jest to podobne do tego, co robi w "stopPlayback(); – vvolkgang

Powiązane problemy