Implemented audiofocuschange listener

This commit is contained in:
daniel oeh 2012-06-15 13:03:55 +02:00
parent b24daa707f
commit a6df2fa2e4

View File

@ -7,9 +7,12 @@ import android.R;
import android.app.Notification; import android.app.Notification;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.app.Service; import android.app.Service;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.media.AudioManager;
import android.media.AudioManager.OnAudioFocusChangeListener;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.support.v4.app.NotificationCompat; import android.support.v4.app.NotificationCompat;
import android.util.Log; import android.util.Log;
@ -32,13 +35,12 @@ public class PlaybackService extends Service {
/** Contains the id of the Feed object of the FeedMedia. */ /** 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 EXTRA_FEED_ID = "extra.de.podfetcher.service.feedId";
public static final String ACTION_PLAYER_STATUS_CHANGED = public static final String ACTION_PLAYER_STATUS_CHANGED = "action.de.podfetcher.service.playerStatusChanged";
"action.de.podfetcher.service.playerStatusChanged";
private static final int NOTIFICATION_ID = 1; private static final int NOTIFICATION_ID = 1;
private NotificationCompat.Builder notificationBuilder; private NotificationCompat.Builder notificationBuilder;
private Notification notification; private AudioManager audioManager;
private MediaPlayer player; private MediaPlayer player;
private FeedMedia media; private FeedMedia media;
private Feed feed; private Feed feed;
@ -67,6 +69,35 @@ public class PlaybackService extends Service {
return mBinder; 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 @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
long mediaId = intent.getLongExtra(EXTRA_MEDIA_ID, -1); long mediaId = intent.getLongExtra(EXTRA_MEDIA_ID, -1);
@ -74,6 +105,10 @@ public class PlaybackService extends Service {
if (mediaId == -1 || feedId == -1) { if (mediaId == -1 || feedId == -1) {
Log.e(TAG, "Media ID or Feed ID wasn't provided to the Service."); Log.e(TAG, "Media ID or Feed ID wasn't provided to the Service.");
} else { } else {
// Intent values appear to be valid
if (audioManager == null) {
setupAudioManager();
}
Feed newFeed = manager.getFeed(feedId); Feed newFeed = manager.getFeed(feedId);
FeedMedia newMedia = manager.getFeedMedia(mediaId, newFeed); FeedMedia newMedia = manager.getFeedMedia(mediaId, newFeed);
if (media != null && media != newMedia) { if (media != null && media != newMedia) {
@ -97,7 +132,8 @@ public class PlaybackService extends Service {
} else if (media == null) { } else if (media == null) {
media = newMedia; media = newMedia;
feed = newFeed; 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); setStatus(PlayerStatus.PREPARING);
player.setOnPreparedListener(preparedListener); player.setOnPreparedListener(preparedListener);
Log.d(TAG, "Preparing to play file"); Log.d(TAG, "Preparing to play file");
@ -132,7 +168,15 @@ public class PlaybackService extends Service {
public void onPrepared(MediaPlayer mp) { public void onPrepared(MediaPlayer mp) {
Log.d(TAG, "Resource prepared"); Log.d(TAG, "Resource prepared");
setStatus(PlayerStatus.PREPARED); setStatus(PlayerStatus.PREPARED);
int focusGained = audioManager.requestAudioFocus(
audioFocusChangeListener, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
if (focusGained == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
Log.d(TAG, "Audiofocus successfully requested");
play(); play();
} else {
Log.d(TAG, "Failed to request Audiofocus");
}
} }
}; };
@ -163,25 +207,27 @@ public class PlaybackService extends Service {
} }
private void setupNotification() { private void setupNotification() {
PendingIntent pIntent = PendingIntent.getActivity( PendingIntent pIntent = PendingIntent.getActivity(this, 0, new Intent(
this, 0, new Intent(this, MediaplayerActivity.class), PendingIntent.FLAG_UPDATE_CURRENT); this, MediaplayerActivity.class),
PendingIntent.FLAG_UPDATE_CURRENT);
Bitmap icon = BitmapFactory.decodeResource(null, R.drawable.stat_notify_sdcard); Bitmap icon = BitmapFactory.decodeResource(null,
R.drawable.stat_notify_sdcard);
notificationBuilder = new NotificationCompat.Builder(this) notificationBuilder = new NotificationCompat.Builder(this)
.setContentTitle("Mediaplayer Service") .setContentTitle("Mediaplayer Service")
.setContentInfo("Click here for more info") .setContentText("Click here for more info").setOngoing(true)
.setOngoing(true) .setContentIntent(pIntent).setLargeIcon(icon)
.setContentIntent(pIntent)
.setLargeIcon(icon)
.setSmallIcon(R.drawable.stat_notify_sdcard); .setSmallIcon(R.drawable.stat_notify_sdcard);
startForeground(NOTIFICATION_ID, notificationBuilder.getNotification()); startForeground(NOTIFICATION_ID, notificationBuilder.getNotification());
Log.d(TAG, "Notification set up"); 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) { public void seekDelta(int delta) {
seek(player.getCurrentPosition() + delta); seek(player.getCurrentPosition() + delta);
@ -222,7 +268,8 @@ public class PlaybackService extends Service {
try { try {
Thread.sleep(WAITING_INTERVALL); Thread.sleep(WAITING_INTERVALL);
} catch (InterruptedException e) { } 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; return null;
} }
saveCurrentPosition(); saveCurrentPosition();