diff options
author | daniel oeh <daniel.oeh@gmail.com> | 2012-06-15 13:03:55 +0200 |
---|---|---|
committer | daniel oeh <daniel.oeh@gmail.com> | 2012-06-15 13:03:55 +0200 |
commit | a6df2fa2e4aff67c3d0fa8452658717330232bc6 (patch) | |
tree | 695a4ba615e45a45ec6637db8ddf5d89b3544229 /src/de | |
parent | b24daa707f2ece590a95aa5561c578b4356a80cf (diff) | |
download | AntennaPod-a6df2fa2e4aff67c3d0fa8452658717330232bc6.zip |
Implemented audiofocuschange listener
Diffstat (limited to 'src/de')
-rw-r--r-- | src/de/podfetcher/service/PlaybackService.java | 139 |
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; } - + } } |