Manchmal MediaPlayer prepareAsyc () ruft nicht onPrepared () auf, bis POWER gedrückt wurde

Ich habe versucht zu reproduzieren, was meine QA-Team nennt die "Random Pausing Bug" für einige Zeit. Heute habe ich es dreimal reproduziert, während das Debugging mit Logcat auf. Es scheint intermittierend und nur in schlechtem Netzwerk.

Der Benutzer erlebt Audio-Pause, bis sie ihr Telefon berühren (drücken Sie die Power oder Trackball) und es beginnt sofort wieder zu spielen. Dies ist, weil ich anfange in der onPrepared Rückruf, und Start wird nie in diesen Fällen aufgerufen. Das ist unser schwerster Fehler.

Was ich weiß:

1) Dies geschieht intermittierend auf dem Nexus One mit 2.2.1 (nicht sicher, ob es auf anderen Geräten ist)

2) Ich rufe prepareAsyc () von einem PlaybackService an, während der Gerätebildschirm ausgeschaltet ist. Manchmal ist onPrepared () nie aufgerufen, also wird mein nachfolgender mediaplayer.start () Anruf nie gefeuert. Ich kann mit Netzwerk-Schnüffeln und dem Puffer-Rückruf sehen, dass Pufferung stattfindet.

3) Wenn ich die Geräte mit Strom versorgen oder Trackball, um es aufzuwachen, wird onPrepared () sofort aufgerufen (bereits gepuffert) und mein Rückruf startet die Wiedergabe.

Hier sind Protokolle mit Zeitstempeln, die das Thema dreimal zeigen:

ERSTES BEISPIEL (kein Rückruf für 20s bis ich den Netzschalter betätige):

11-10 16:10:55.966 I/AwesomePlayer( 59): calling prefetcher->prepare() 11-10 16:11:15.511 D/KeyguardViewMediator( 94): wakeWhenReadyLocked(26) 11-10 16:11:15.511 D/KeyguardViewMediator( 94): handleWakeWhenReady(26) 11-10 16:11:15.511 D/KeyguardViewMediator( 94): pokeWakelock(5000) 11-10 16:11:15.511 I/power ( 94): *** set_screen_state 1 11-10 16:11:15.561 D/SurfaceFlinger( 94): Screen about to return, flinger = 0x1fe300 11-10 16:11:15.701 D/AK8973 ( 64): Compass Start 11-10 16:11:15.701 D/WifiService( 94): ACTION_SCREEN_ON 11-10 16:11:15.711 I/Prefetcher( 59): [0x602d80] cache below low water mark, filling cache. 11-10 16:11:15.821 I/AwesomePlayer( 59): prefetcher is done preparing 11-10 16:11:15.831 W/MogMediaPlayer.onPreparedListener( 2968): onPrepared, calling notifyPrepared() 

ZWEI MEHR BEISPIELE (das erste Mal 3s, bevor ich die Macht traf, war das nächste 8s):

 11-10 16:14:54.649 I/AwesomePlayer( 59): calling prefetcher->prepare() 11-10 16:14:57.500 D/KeyguardViewMediator( 94): wakeWhenReadyLocked(26) 11-10 16:14:57.500 D/KeyguardViewMediator( 94): handleWakeWhenReady(26) 11-10 16:14:57.500 D/KeyguardViewMediator( 94): pokeWakelock(5000) 11-10 16:14:57.500 I/power ( 94): *** set_screen_state 1 11-10 16:14:57.560 D/SurfaceFlinger( 94): Screen about to return, flinger = 0x1fe300 11-10 16:14:57.580 D/WifiStateTracker( 94): Reset connections and stopping DHCP 11-10 16:14:57.580 D/WifiService( 94): ACTION_SCREEN_ON 11-10 16:14:57.670 I/Prefetcher( 59): [0xa990] cache below low water mark, filling cache. 11-10 16:14:57.700 D/AK8973 ( 64): Compass Start 11-10 16:14:57.800 I/AwesomePlayer( 59): prefetcher is done preparing 11-10 16:14:57.800 W/MogMediaPlayer.onPreparedListener( 2968): onPrepared, calling notifyPrepared() 11-10 16:39:03.608 I/AwesomePlayer( 59): calling prefetcher->prepare() 11-10 16:39:11.506 D/KeyguardViewMediator( 94): wakeWhenReadyLocked(26) 11-10 16:39:11.506 D/KeyguardViewMediator( 94): handleWakeWhenReady(26) 11-10 16:39:11.506 D/KeyguardViewMediator( 94): pokeWakelock(5000) 11-10 16:39:11.506 I/power ( 94): *** set_screen_state 1 11-10 16:39:11.566 D/SurfaceFlinger( 94): Screen about to return, flinger = 0x1fe300 11-10 16:39:11.586 D/WifiStateTracker( 94): Reset connections and stopping DHCP 11-10 16:39:11.586 D/WifiService( 94): ACTION_SCREEN_ON 11-10 16:39:11.716 D/AK8973 ( 64): Compass Start 11-10 16:39:11.766 I/Prefetcher( 59): [0x59ac18] cache below low water mark, filling cache. 11-10 16:39:11.856 I/AwesomePlayer( 59): prefetcher is done preparing 11-10 16:39:11.946 W/MogMediaPlayer.onPreparedListener( 2968): onPrepared, calling notifyPrepared() 

Kennt jemand etwas über diesen Bug oder wie man es umgehen kann?

Vielen Dank im Voraus, Ben

2 Solutions collect form web for “Manchmal MediaPlayer prepareAsyc () ruft nicht onPrepared () auf, bis POWER gedrückt wurde”

Ich erlebe etwas Ähnliches auf Android 2.3.3, 2.3.7 und 4.1.2. Für mich, nach der Arbeit ganz gut für einige Zeit, MediaPlayer zufällig weigert sich zu laden. Der Unterschied ist, dass für mich die Power-Taste nicht helfen, entweder – nichts ist, onPrepared ist einfach nie aufgerufen. Ich spiele Dateien von der SD-Karte und nicht das Netzwerk, so dass Pufferung kein Problem ist. Es passiert mehr, wenn Dateien häufig geladen werden, aber im Allgemeinen passiert der Fehler einfach oft genug, um alle meine Benutzer zu beeinflussen.

Ihr Problem scheint mit mir verwandt zu sein, aber leider habe ich auch keine Antwort für euch. Ich schicke das hier, um mehr Informationen über das Problem zu sammeln. Ich habe versucht mit setDataSource, prepare, prepareAsync sowie die MediaPlayer.create () -Methode, die das Laden der angegebenen Datei sofort beginnt. Ich habe versucht, den gleichen Mediaplyer (mit mp.reset ()) wiederzuverwenden und eine brandneue für jede neue Datei zu laden, die geladen werden soll (ich höre und rufe freigeben () auf dem vorherigen Spieler vorher), aber nichts macht einen Unterschied: Wenn der Benutzer schneller durch Dateien umschalten will (aber nichts übertrieben – würde ich erwarten, dass jede Medien-App damit umgehen kann), in der Nähe von 1 von 5 Dateien fehlgeschlagen ist, Fehler zu melden oder zu laden.

Schließlich fand eine Lösung in einem anderen Thread, wo jemand hatte das Problem mit Streaming Audio mit dem MediaPlayer hier .

Der Trick ist, das Gerät aufzuwecken, bevor der nächste Track über WakeLock vorbereitet. Dies führt nicht dazu, dass der Bildschirm aufleuchtet, also keine Sorgen. Beschrieben, wie ich es endlich geschafft habe

Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.