summaryrefslogtreecommitdiff
path: root/src/de/podfetcher/service/PlaybackService.java
diff options
context:
space:
mode:
authordaniel oeh <daniel.oeh@gmail.com>2012-06-15 13:03:55 +0200
committerdaniel oeh <daniel.oeh@gmail.com>2012-06-15 13:03:55 +0200
commita6df2fa2e4aff67c3d0fa8452658717330232bc6 (patch)
tree695a4ba615e45a45ec6637db8ddf5d89b3544229 /src/de/podfetcher/service/PlaybackService.java
parentb24daa707f2ece590a95aa5561c578b4356a80cf (diff)
downloadAntennaPod-a6df2fa2e4aff67c3d0fa8452658717330232bc6.zip
Implemented audiofocuschange listener
Diffstat (limited to 'src/de/podfetcher/service/PlaybackService.java')
-rw-r--r--src/de/podfetcher/service/PlaybackService.java139
1 files changed, 93 insertions, 46 deletions
diff --git a/src/de/podfetcher/service/PlaybackService.java b/src/de/podfetcher/service/PlaybackService.java
index 8668248d2..ac590d683 100644
--- a/src/de/podfetcher/service/PlaybackService.java
+++ b/src/de/podfetcher/service/PlaybackService.java
@@ -7,9 +7,12 @@ import android.R;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
+import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.media.AudioManager;
+import android.media.AudioManager.OnAudioFocusChangeListener;
import android.media.MediaPlayer;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
@@ -32,13 +35,12 @@ public class PlaybackService extends Service {
/** Contains the id of the Feed object of the FeedMedia. */
public static final String EXTRA_FEED_ID = "extra.de.podfetcher.service.feedId";
- public static final String ACTION_PLAYER_STATUS_CHANGED =
- "action.de.podfetcher.service.playerStatusChanged";
-
+ public static final String ACTION_PLAYER_STATUS_CHANGED = "action.de.podfetcher.service.playerStatusChanged";
+
private static final int NOTIFICATION_ID = 1;
private NotificationCompat.Builder notificationBuilder;
-
- private Notification notification;
+
+ private AudioManager audioManager;
private MediaPlayer player;
private FeedMedia media;
private Feed feed;
@@ -47,13 +49,13 @@ public class PlaybackService extends Service {
private PositionSaver positionSaver;
private final IBinder mBinder = new LocalBinder();
-
+
public class LocalBinder extends Binder {
- public PlaybackService getService() {
- return PlaybackService.this;
- }
- }
-
+ public PlaybackService getService() {
+ return PlaybackService.this;
+ }
+ }
+
@Override
public void onCreate() {
super.onCreate();
@@ -67,6 +69,35 @@ public class PlaybackService extends Service {
return mBinder;
}
+ private void setupAudioManager() {
+ audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
+ }
+
+ private final OnAudioFocusChangeListener audioFocusChangeListener = new OnAudioFocusChangeListener() {
+
+ @Override
+ public void onAudioFocusChange(int focusChange) {
+ switch (focusChange) {
+ case AudioManager.AUDIOFOCUS_LOSS:
+ Log.d(TAG, "Lost audio focus");
+ pause();
+ stopSelf();
+ break;
+ case AudioManager.AUDIOFOCUS_GAIN:
+ Log.d(TAG, "Gained audio focus");
+ play();
+ break;
+ case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
+ Log.d(TAG, "Lost audio focus temporarily. Ducking...");
+ audioManager.adjustStreamVolume(AudioManager.STREAM_MUSIC, AudioManager.ADJUST_LOWER, 0);
+ break;
+ case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
+ Log.d(TAG, "Lost audio focus temporarily. Pausing...");
+ pause();
+ }
+ }
+ };
+
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
long mediaId = intent.getLongExtra(EXTRA_MEDIA_ID, -1);
@@ -74,6 +105,10 @@ public class PlaybackService extends Service {
if (mediaId == -1 || feedId == -1) {
Log.e(TAG, "Media ID or Feed ID wasn't provided to the Service.");
} else {
+ // Intent values appear to be valid
+ if (audioManager == null) {
+ setupAudioManager();
+ }
Feed newFeed = manager.getFeed(feedId);
FeedMedia newMedia = manager.getFeedMedia(mediaId, newFeed);
if (media != null && media != newMedia) {
@@ -93,21 +128,22 @@ public class PlaybackService extends Service {
}
media = newMedia;
feed = newFeed;
-
+
} else if (media == null) {
media = newMedia;
feed = newFeed;
- player = MediaPlayer.create(this, Uri.fromFile(new File(media.getFile_url())));
+ player = MediaPlayer.create(this,
+ Uri.fromFile(new File(media.getFile_url())));
setStatus(PlayerStatus.PREPARING);
player.setOnPreparedListener(preparedListener);
Log.d(TAG, "Preparing to play file");
}
-
+
}
setupNotification();
return Service.START_STICKY;
}
-
+
private void setupPositionSaver() {
if (positionSaver == null) {
positionSaver = new PositionSaver() {
@@ -121,7 +157,7 @@ public class PlaybackService extends Service {
protected void onPostExecute(Void result) {
super.onPostExecute(result);
positionSaver = null;
- }
+ }
};
positionSaver.execute();
}
@@ -132,10 +168,18 @@ public class PlaybackService extends Service {
public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "Resource prepared");
setStatus(PlayerStatus.PREPARED);
- play();
+ int focusGained = audioManager.requestAudioFocus(
+ audioFocusChangeListener, AudioManager.STREAM_MUSIC,
+ AudioManager.AUDIOFOCUS_GAIN);
+ if (focusGained == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
+ Log.d(TAG, "Audiofocus successfully requested");
+ play();
+ } else {
+ Log.d(TAG, "Failed to request Audiofocus");
+ }
}
};
-
+
public void pause() {
if (player.isPlaying()) {
Log.d(TAG, "Pausing playback.");
@@ -144,7 +188,7 @@ public class PlaybackService extends Service {
setStatus(PlayerStatus.PAUSED);
}
}
-
+
public void play() {
if (status == PlayerStatus.PAUSED || status == PlayerStatus.PREPARED) {
Log.d(TAG, "Resuming/Starting playback");
@@ -153,83 +197,86 @@ public class PlaybackService extends Service {
setStatus(PlayerStatus.PLAYING);
setupPositionSaver();
} else if (status == PlayerStatus.STOPPED) {
-
+
}
}
-
+
private void setStatus(PlayerStatus newStatus) {
status = newStatus;
sendBroadcast(new Intent(ACTION_PLAYER_STATUS_CHANGED));
}
-
+
private void setupNotification() {
- PendingIntent pIntent = PendingIntent.getActivity(
- this, 0, new Intent(this, MediaplayerActivity.class), PendingIntent.FLAG_UPDATE_CURRENT);
-
- Bitmap icon = BitmapFactory.decodeResource(null, R.drawable.stat_notify_sdcard);
+ PendingIntent pIntent = PendingIntent.getActivity(this, 0, new Intent(
+ this, MediaplayerActivity.class),
+ PendingIntent.FLAG_UPDATE_CURRENT);
+
+ Bitmap icon = BitmapFactory.decodeResource(null,
+ R.drawable.stat_notify_sdcard);
notificationBuilder = new NotificationCompat.Builder(this)
- .setContentTitle("Mediaplayer Service")
- .setContentInfo("Click here for more info")
- .setOngoing(true)
- .setContentIntent(pIntent)
- .setLargeIcon(icon)
- .setSmallIcon(R.drawable.stat_notify_sdcard);
-
-
+ .setContentTitle("Mediaplayer Service")
+ .setContentText("Click here for more info").setOngoing(true)
+ .setContentIntent(pIntent).setLargeIcon(icon)
+ .setSmallIcon(R.drawable.stat_notify_sdcard);
+
startForeground(NOTIFICATION_ID, notificationBuilder.getNotification());
Log.d(TAG, "Notification set up");
}
-
- /** Seek a specific position from the current position
- * @param delta offset from current position (positive or negative)
+
+ /**
+ * Seek a specific position from the current position
+ *
+ * @param delta
+ * offset from current position (positive or negative)
* */
public void seekDelta(int delta) {
seek(player.getCurrentPosition() + delta);
}
-
+
public void seek(int i) {
Log.d(TAG, "Seeking position " + 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() {
return status;
}
-
+
public FeedMedia getMedia() {
return media;
}
-
+
public MediaPlayer getPlayer() {
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...");
+ Log.d(TAG,
+ "Thread was interrupted while waiting. Finishing now...");
return null;
}
saveCurrentPosition();
}
return null;
}
-
+
}
}