Made the media player illegalstate secure
This commit is contained in:
parent
cfa6ddaa2e
commit
b5f160dd89
2 changed files with 77 additions and 31 deletions
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue