From 223102793412211df51b0967ead544a974ae1715 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Mon, 20 Apr 2015 19:50:01 +0200 Subject: [PATCH] Added temporary wakelock in the gap between MediaPlayers onCompletion() and start() to finally fix the issue where the player stops after a track is finished on some devices. --- .../gramophone/service/MusicService.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java index a262b4cb..99b0dc53 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java +++ b/app/src/main/java/com/kabouzeid/gramophone/service/MusicService.java @@ -80,6 +80,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe private AudioManager audioManager; private RemoteControlClient remoteControlClient; private Future remoteControlClientAlbumArtTask; + private PowerManager.WakeLock wakeLock; public MusicService() { } @@ -95,6 +96,10 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe shuffleMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(AppKeys.SP_SHUFFLE_MODE, 0); repeatMode = PreferenceManager.getDefaultSharedPreferences(this).getInt(AppKeys.SP_REPEAT_MODE, 0); + final PowerManager powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); + wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, getClass().getName()); + wakeLock.setReferenceCounted(false); + registerEverything(); } @@ -269,6 +274,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_STOPPED); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.STOP); } else { + acquireWakeLock(30000); playNextSong(false); } } @@ -289,7 +295,6 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe registerEverything(); isPlayerPrepared = false; player.reset(); - player.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK); if (position != -1) { try { Uri trackUri = getCurrentPositionTrackUri(); @@ -470,6 +475,7 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe remoteControlClient.setPlaybackState(RemoteControlClient.PLAYSTATE_PLAYING); notifyOnMusicRemoteEventListeners(MusicRemoteEvent.PLAY); savePosition(); + releaseWakeLock(); } public void openQueue(final ArrayList playingQueue, final int startPosition, final boolean startPlaying) { @@ -774,6 +780,16 @@ public class MusicService extends Service implements MediaPlayer.OnPreparedListe return player.getAudioSessionId(); } + private void releaseWakeLock() { + if (wakeLock.isHeld()) { + wakeLock.release(); + } + } + + private void acquireWakeLock(long milli) { + wakeLock.acquire(milli); + } + public class MusicBinder extends Binder { public MusicService getService() { return MusicService.this;