2013-02-20 5 views
5

Ich habe eine SeekBar und eine MediaPlayer. Ich will versuchen, während es angehalten, aber scheint, dass docs mir liegt:Pause und suchen in Android MediaPlayer

Bitte beachten Sie, dass seekTo (int) können auch in den anderen Staaten genannt werden, wie Fertig-, Paused und PlaybackCompleted Zustand.

Wie üblich auf Android Ich habe Abhilfen statt Code zu schreiben (und in welchem ​​Zustand ist MediaPlayer zu diesem Zeitpunkt kann ich nicht wissen, so dass in diese Tabelle und die Zustandsmaschine ist völlig nutzlos). Denn statt onSeekCompleteonCompletion (über 9000 mal, ich mache keine Witze) Methode heißt! onSeekComplete wird nur nach dem Aufruf seekTo von onPrepared aufgerufen (WARUM, GOTT, WARUM ???). Ich weiß nicht einmal, was ich tun soll. Ich habe ungefähr 5 Stunden damit verbracht und nichts ist behoben. Was kann ich tun?

UPD

Hier ist mein Code.

private void setupMediaPlayer() { 
    savedMediaPlayerState = null; 

    mediaPlayer = application.getMediaPlayer(); 

    String mp3Path = "/path/to/mp3"; 

    mediaPlayer.setOnCompletionListener(this); 
    mediaPlayer.setOnSeekCompleteListener(this); 
    mediaPlayer.setOnErrorListener(this); 

    mediaPlayer.setDataSource(mp3Path); 
    mediaPlayer.prepare(); 
} 

@Override 
public void onProgressChanged(android.widget.SeekBar sb, int i, boolean b) { 
    Log.i(TAG, String.format("Progress changed! %d", i)); 
    if (b) { 
     mediaPlayer.seekTo(i); 
     updateProgressBarAndDurationLabels(i, mediaPlayer.getDuration(), false); 
    } 
} 

@Override 
public void onStartTrackingTouch(android.widget.SeekBar sb) { 
    handler.removeCallbacks(updateTimeTask); 
    mediaPlayer.pause(); 
} 

@Override 
public void onStopTrackingTouch(android.widget.SeekBar sb) { 
    int totalDuration = mediaPlayer.getDuration(); 
    int currentPosition = sb.getProgress();// * totalDuration/100; 

    mediaPlayer.seekTo(currentPosition); 
    mediaPlayer.start(); 

    updateProgressBar(); 

    isSeeking = false; 
} 

@Override 
public void onCompletion(MediaPlayer mediaPlayer) { 
    if (!isSeeking) { 
     Log.i(TAG, "completed"); // Called over 9000 times 
     audioStopped(); 
    } 
} 

@Override 
public boolean onError(MediaPlayer mediaPlayer, int i, int i2) { 
    return false; // Error -38 lol 
} 

@Override 
public void onSeekComplete(MediaPlayer mp) { 
    Log.i(TAG, String.format("seek to: %d", mp.getCurrentPosition())); 
    isSeeking = false; 
} 
+1

Lassen Sie uns etwas Code sehen. Ich habe 'seekTo()' bei mehreren Gelegenheiten benutzt. – Geobits

+0

@Geobits Ich hatte etwas Code hinzugefügt. – efpies

Antwort

7

Nach dem onErrorListener Zugabe entdeckte ich, dass der Fehler bei what=-38 hier geschieht. Die Rückgabe von true von onError löste jedoch mein Problem. Niemand weiß, was es bedeutet.