2010-07-09 1 views
12

Ich benutze MediaPlayer für die Wiedergabe eines einzigen mp3-Songs aus dem Netzwerk. Datenquelle ist eine HTTP-URL.MediaPlayer.seekTo() funktioniert nicht für ungepufferte Position

Angenommen, wir haben folgenden Spielstatus.

Song-Dauer: 1.00

Aktuelle Fortschritte: 00.10

Strompufferung Fortschritt 0:30

Lassen Sie uns sagen, dass ich einen Teil eines Songs überspringen wollen und nach vorne suchen. Ich mache es mit MediaPlayer.seekTo() -Methode. Wenn ich eine gepufferte Position suche (0:20), wird sie korrekt ausgeführt. Aber wenn ich eine Position suche, die noch nicht gepuffert wurde (0:40) verhält sich der MediaPlayer merkwürdig. Es zeigt sofort an, dass es korrekt gesucht hat, ohne auf das Füllen eines Puffers zu warten. In der Tat spielt es weiter an derselben Stelle, wo es vor dem Suchen war. Von nun an gibt die MediaPlayer.getCurrentPosition() Methode eine falsche Position zurück. Wenn das Abspielen beendet ist und OnCompletionListener.onCompletion Callback aufgerufen wird, ist die aktuelle Position des Media Players viel höher als die gesamte Songdauer.

Irgendwelche Ideen, um das zu lösen?

Antwort

1

Es ist wahrscheinlich auf die Fehler im Zusammenhang, die schließlich (zu einem der Kommentare beziehen) sind in 2.2 festgelegt, wie bisher nur in einigen Geräten in Android 2.2 Fest http://code.google.com/p/android/issues/detail?id=4124

+0

Danke. Es scheint der Grund zu sein. – plugmind

+0

ja, es gibt ein paar Bugs in der Bug-Tracker im Zusammenhang mit dem Media Player ....;) BTW: Wenn die Antwort hilfreich war, bitte akzeptieren Sie die Antwort (grünes Häkchen) –

+1

Dieser Fehler gilt noch für 2.2 Motorola Droid Geräte, weil sie aus irgendeinem Grund immer noch PVPlayer im Gegensatz zu Stagefright/Awesomeplayer verwenden. Die beste Workaround-Lösung ist die Lösung von jBilbo oder das Herunterladen und Abspielen von SD. – brack

3

Es wurde, wie ich weiß.

Aber Android 2.2 vermasselt mit dem Streben nach gepufferter Posistion. Obwohl eine Position bereits gepuffert ist, sendet der MediaPlayer eine Anfrage an einen Server.

3

fand ich eine Abhilfe für dieses Problem:

Zuerst erstellen Sie ein OnBufferingUpdateListener:

MediaPlayer.OnBufferingUpdateListener bufferingListener = new MediaPlayer.OnBufferingUpdateListener() { 
    public void onBufferingUpdate(MediaPlayer mp, int percent) { 
     //code to increase your secondary seekbar 
    } 
}; 

Dann in Ihrem seekbar Ereignis die folgende onProgressChanged tun: Das

public void onProgressChanged(SeekBar seekBar, int progress, 
       boolean fromUser) { 
    int secondaryPosition = seekBar.getSecondaryProgress(); 
    if (progress > secondaryPosition) 
     seekBar.setProgress(secondaryPosition); 
} 

Mit Ihnen garantieren, Der Benutzer kann den Fortschrittsbalken nicht auf eine ungepufferte Position ziehen (und auch sehen, was gepuffert ist).

+0

bereits auf ähnliche Weise getroffen. Danke trotzdem. – plugmind