ネットワークから 1 つの MP3 曲を再生するために MediaPlayer を使用しています。データ ソースは、ネットワークからダウンロードされたファイルです。このファイルはチャンクで提供されます。
次の再生状態があるとします。
曲の長さ: 4:00
プレーヤーに読み込まれた現在のチャンク: 1:00
曲の一部をスキップして前方にシークしたいとしましょう。MediaPlayer.seekTo() メソッドで行います。位置 (1:40) をシークすると、正しく実行されず、シーク バーが開始位置 (00:00) に移動し、プレーヤーが停止します。
public static void seekTo(int progress) {
try {
MediaPlayer mp = new MediaPlayer();
mp.setDataSource(sFilePath);
mp.prepare();
int offset = (progress * mp.getDuration()) / 100;
if (sCompleted)
return;
sLastSeek = offset;
if (offset > sMediaPlayer.getDuration()) {
sMediaPlayer.reset();
sMediaPlayer.setDataSource(sFilePath);
sMediaPlayer.prepareAsync();
} else {
sMediaPlayer.seekTo(offset);
}
} catch (Exception ex) {
ex.printStackTrace();
}
}