Made the media player illegalstate secure

This commit is contained in:
Karim Abou Zeid 2015-07-07 03:58:01 +02:00
commit b5f160dd89
2 changed files with 77 additions and 31 deletions

View file

@ -13,7 +13,6 @@ import android.widget.Toast;
import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.PreferenceUtils; import com.kabouzeid.gramophone.util.PreferenceUtils;
import java.io.IOException;
import java.lang.ref.WeakReference; import java.lang.ref.WeakReference;
/** /**
@ -26,7 +25,6 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
private final WeakReference<MusicService> mService; private final WeakReference<MusicService> mService;
private MediaPlayer mCurrentMediaPlayer = new MediaPlayer(); private MediaPlayer mCurrentMediaPlayer = new MediaPlayer();
private MediaPlayer mNextMediaPlayer; private MediaPlayer mNextMediaPlayer;
private Handler mHandler; private Handler mHandler;
@ -38,7 +36,7 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
*/ */
public MultiPlayer(final MusicService service) { public MultiPlayer(final MusicService service) {
mService = new WeakReference<>(service); mService = new WeakReference<>(service);
mCurrentMediaPlayer.setWakeMode(mService.get(), PowerManager.PARTIAL_WAKE_LOCK); mCurrentMediaPlayer.setWakeMode(service, PowerManager.PARTIAL_WAKE_LOCK);
} }
/** /**
@ -64,28 +62,30 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* ready to play, false otherwise * ready to play, false otherwise
*/ */
private boolean setDataSourceImpl(final MediaPlayer player, final String path) { private boolean setDataSourceImpl(final MediaPlayer player, final String path) {
MusicService service = mService.get();
if (service == null) {
return false;
}
try { try {
player.reset(); player.reset();
player.setOnPreparedListener(null); player.setOnPreparedListener(null);
if (path.startsWith("content://")) { if (path.startsWith("content://")) {
player.setDataSource(mService.get(), Uri.parse(path)); player.setDataSource(service, Uri.parse(path));
} else { } else {
player.setDataSource(path); player.setDataSource(path);
} }
player.setAudioStreamType(AudioManager.STREAM_MUSIC); player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.prepare(); player.prepare();
} catch (final IOException e) { } catch (Exception e) {
return false;
} catch (final IllegalArgumentException e) {
return false; return false;
} }
player.setOnCompletionListener(this); player.setOnCompletionListener(this);
player.setOnErrorListener(this); player.setOnErrorListener(this);
final Intent intent = new Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION); final Intent intent = new Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION);
intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, getAudioSessionId()); intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, getAudioSessionId());
intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, mService.get().getPackageName()); intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, service.getPackageName());
intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC); intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC);
mService.get().sendBroadcast(intent); service.sendBroadcast(intent);
return true; return true;
} }
@ -96,6 +96,10 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* you want to play * you want to play
*/ */
public void setNextDataSource(final String path) { public void setNextDataSource(final String path) {
MusicService service = mService.get();
if (service == null) {
return;
}
try { try {
mCurrentMediaPlayer.setNextMediaPlayer(null); mCurrentMediaPlayer.setNextMediaPlayer(null);
} catch (IllegalArgumentException e) { } catch (IllegalArgumentException e) {
@ -116,7 +120,15 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
mNextMediaPlayer.setWakeMode(mService.get(), PowerManager.PARTIAL_WAKE_LOCK); mNextMediaPlayer.setWakeMode(mService.get(), PowerManager.PARTIAL_WAKE_LOCK);
mNextMediaPlayer.setAudioSessionId(getAudioSessionId()); mNextMediaPlayer.setAudioSessionId(getAudioSessionId());
if (setDataSourceImpl(mNextMediaPlayer, path)) { if (setDataSourceImpl(mNextMediaPlayer, path)) {
mCurrentMediaPlayer.setNextMediaPlayer(mNextMediaPlayer); try {
mCurrentMediaPlayer.setNextMediaPlayer(mNextMediaPlayer);
} catch (IllegalArgumentException | IllegalStateException e) {
Log.e(TAG, "setNextDataSource: setNextMediaPlayer()", e);
if (mNextMediaPlayer != null) {
mNextMediaPlayer.release();
mNextMediaPlayer = null;
}
}
} else { } else {
if (mNextMediaPlayer != null) { if (mNextMediaPlayer != null) {
mNextMediaPlayer.release(); mNextMediaPlayer.release();
@ -145,8 +157,13 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
/** /**
* Starts or resumes playback. * Starts or resumes playback.
*/ */
public void start() { public boolean start() {
mCurrentMediaPlayer.start(); try {
mCurrentMediaPlayer.start();
return true;
} catch (IllegalStateException e) {
return false;
}
} }
/** /**
@ -163,13 +180,21 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
public void release() { public void release() {
stop(); stop();
mCurrentMediaPlayer.release(); mCurrentMediaPlayer.release();
if (mNextMediaPlayer != null) {
mNextMediaPlayer.release();
}
} }
/** /**
* Pauses playback. Call start() to resume. * Pauses playback. Call start() to resume.
*/ */
public void pause() { public boolean pause() {
mCurrentMediaPlayer.pause(); try {
mCurrentMediaPlayer.pause();
return true;
} catch (IllegalStateException e) {
return false;
}
} }
/** /**
@ -185,7 +210,11 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* @return The duration in milliseconds * @return The duration in milliseconds
*/ */
public int duration() { public int duration() {
return mCurrentMediaPlayer.getDuration(); try {
return mCurrentMediaPlayer.getDuration();
} catch (IllegalStateException e) {
return -1;
}
} }
/** /**
@ -194,7 +223,11 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* @return The current position in milliseconds * @return The current position in milliseconds
*/ */
public int position() { public int position() {
return mCurrentMediaPlayer.getCurrentPosition(); try {
return mCurrentMediaPlayer.getCurrentPosition();
} catch (IllegalStateException e) {
return -1;
}
} }
/** /**
@ -203,18 +236,22 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* @param whereto The offset in milliseconds from the start to seek to * @param whereto The offset in milliseconds from the start to seek to
* @return The offset in milliseconds from the start to seek to * @return The offset in milliseconds from the start to seek to
*/ */
public long seek(final long whereto) { public int seek(final int whereto) {
mCurrentMediaPlayer.seekTo((int) whereto); try {
return whereto; mCurrentMediaPlayer.seekTo(whereto);
return whereto;
} catch (IllegalStateException e) {
return -1;
}
} }
/** public boolean setVolume(final float vol) {
* Sets the volume on this player. try {
* mCurrentMediaPlayer.setVolume(vol, vol);
* @param vol Left and right volume scalar return true;
*/ } catch (IllegalStateException e) {
public void setVolume(final float vol) { return false;
mCurrentMediaPlayer.setVolume(vol, vol); }
} }
/** /**
@ -222,8 +259,13 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* *
* @param sessionId The audio session ID * @param sessionId The audio session ID
*/ */
public void setAudioSessionId(final int sessionId) { public boolean setAudioSessionId(final int sessionId) {
mCurrentMediaPlayer.setAudioSessionId(sessionId); try {
mCurrentMediaPlayer.setAudioSessionId(sessionId);
return true;
} catch (IllegalArgumentException | IllegalStateException e) {
return false;
}
} }
/** /**
@ -253,6 +295,10 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
*/ */
@Override @Override
public void onCompletion(final MediaPlayer mp) { public void onCompletion(final MediaPlayer mp) {
MusicService service = mService.get();
if (service == null) {
return;
}
if (mp == mCurrentMediaPlayer && mNextMediaPlayer != null) { if (mp == mCurrentMediaPlayer && mNextMediaPlayer != null) {
mIsInitialized = false; mIsInitialized = false;
mCurrentMediaPlayer.release(); mCurrentMediaPlayer.release();
@ -261,7 +307,7 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
mNextMediaPlayer = null; mNextMediaPlayer = null;
mHandler.sendEmptyMessage(MusicService.TRACK_WENT_TO_NEXT); mHandler.sendEmptyMessage(MusicService.TRACK_WENT_TO_NEXT);
} else { } else {
mService.get().acquireWakeLock(30000); service.acquireWakeLock(30000);
mHandler.sendEmptyMessage(MusicService.TRACK_ENDED); mHandler.sendEmptyMessage(MusicService.TRACK_ENDED);
mHandler.sendEmptyMessage(MusicService.RELEASE_WAKELOCK); mHandler.sendEmptyMessage(MusicService.RELEASE_WAKELOCK);
} }

View file

@ -731,11 +731,11 @@ public class MusicService extends Service {
} }
public int getSongProgressMillis() { public int getSongProgressMillis() {
return player.isInitialized() ? player.position() : 0; return player.position();
} }
public int getSongDurationMillis() { public int getSongDurationMillis() {
return player.isInitialized() ? player.duration() : 0; return player.duration();
} }
public void seek(int millis) { public void seek(int millis) {