Implemented mechanism to save the current position of a playing media

file
This commit is contained in:
daniel
2012-06-06 20:08:11 +02:00
parent df298ba2e7
commit e8db6ed778
2 changed files with 57 additions and 7 deletions

View File

@ -13,6 +13,7 @@ import android.media.MediaPlayer;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import android.util.Log; import android.util.Log;
import android.net.Uri; import android.net.Uri;
import android.os.AsyncTask;
import android.os.Binder; import android.os.Binder;
import android.os.IBinder; import android.os.IBinder;
@ -42,6 +43,7 @@ public class PlaybackService extends Service {
private Feed feed; private Feed feed;
private FeedManager manager; private FeedManager manager;
private PlayerStatus status; private PlayerStatus status;
private PositionSaver positionSaver;
private final IBinder mBinder = new LocalBinder(); private final IBinder mBinder = new LocalBinder();
@ -81,18 +83,36 @@ public class PlaybackService extends Service {
setStatus(PlayerStatus.PREPARING); setStatus(PlayerStatus.PREPARING);
player.setOnPreparedListener(preparedListener); player.setOnPreparedListener(preparedListener);
Log.d(TAG, "Preparing to play file"); Log.d(TAG, "Preparing to play file");
//player.prepareAsync();
} }
setupNotification(); setupNotification();
return Service.START_STICKY; return Service.START_STICKY;
} }
private void setupPositionSaver() {
if (positionSaver == null) {
positionSaver = new PositionSaver() {
@Override
protected void onCancelled(Void result) {
super.onCancelled(result);
positionSaver = null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
positionSaver = null;
}
};
positionSaver.execute();
}
}
private MediaPlayer.OnPreparedListener preparedListener = new MediaPlayer.OnPreparedListener() { private MediaPlayer.OnPreparedListener preparedListener = new MediaPlayer.OnPreparedListener() {
@Override @Override
public void onPrepared(MediaPlayer mp) { public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "Resource prepared"); Log.d(TAG, "Resource prepared");
mp.start(); setStatus(PlayerStatus.PREPARED);
setStatus(PlayerStatus.PLAYING); play();
} }
}; };
@ -100,15 +120,17 @@ public class PlaybackService extends Service {
if (player.isPlaying()) { if (player.isPlaying()) {
Log.d(TAG, "Pausing playback."); Log.d(TAG, "Pausing playback.");
player.pause(); player.pause();
saveCurrentPosition();
setStatus(PlayerStatus.PAUSED); setStatus(PlayerStatus.PAUSED);
} }
} }
public void play() { public void play() {
if (status == PlayerStatus.PAUSED) { if (status == PlayerStatus.PAUSED || status == PlayerStatus.PREPARED) {
Log.d(TAG, "Resuming playback"); Log.d(TAG, "Resuming/Starting playback");
player.start(); player.start();
setStatus(PlayerStatus.PLAYING); setStatus(PlayerStatus.PLAYING);
setupPositionSaver();
} else if (status == PlayerStatus.STOPPED) { } else if (status == PlayerStatus.STOPPED) {
} }
@ -147,6 +169,14 @@ public class PlaybackService extends Service {
public void seek(int i) { public void seek(int i) {
Log.d(TAG, "Seeking position " + i); Log.d(TAG, "Seeking position " + i);
player.seekTo(i); player.seekTo(i);
saveCurrentPosition();
}
/** Saves the current position of the media file to the DB */
private synchronized void saveCurrentPosition() {
Log.d(TAG, "Saving current position to " + player.getCurrentPosition());
media.setPosition(player.getCurrentPosition());
manager.setFeedMedia(this, media);
} }
public PlayerStatus getStatus() { public PlayerStatus getStatus() {
@ -161,4 +191,24 @@ public class PlaybackService extends Service {
return player; return player;
} }
/** Periodically saves the position of the media file */
class PositionSaver extends AsyncTask<Void, Void, Void> {
private static final int WAITING_INTERVALL = 5000;
@Override
protected Void doInBackground(Void... params) {
while (!isCancelled() && player.isPlaying()) {
try {
Thread.sleep(WAITING_INTERVALL);
} catch (InterruptedException e) {
Log.d(TAG, "Thread was interrupted while waiting. Finishing now...");
return null;
}
saveCurrentPosition();
}
return null;
}
}
} }

View File

@ -1,5 +1,5 @@
package de.podfetcher.service; package de.podfetcher.service;
public enum PlayerStatus { public enum PlayerStatus {
ERROR, PREPARING, PAUSED, PLAYING, STOPPED ERROR, PREPARING, PAUSED, PLAYING, STOPPED, PREPARED
} }