Last active
August 29, 2015 14:05
-
-
Save thedumbtechguy/23c9c88592723e8b2811 to your computer and use it in GitHub Desktop.
Handling focus in Android media player
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@Override | |
public void onPrepared(MediaPlayer mediaPlayer) { | |
mIsPrepared = true; | |
isLoadingNew = false; | |
mLostFocus = false; | |
if (startFocus() == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { | |
initForeground(); | |
mMediaPlayer.start(); | |
mDuration = mMediaPlayer.getDuration(); | |
checkProgress(); | |
if(mLastSongUID != null) { | |
Bundle data = new Bundle(); | |
data.putString(Constant.UID, mLastSongUID); | |
PlayerService.this.sendMessage(MSG_EVENT_MEDIA_PLAY_START, -1, -1, data); | |
} | |
} | |
else { | |
mLostFocus = true; | |
} | |
} | |
int startFocus() { | |
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); | |
return audioManager.requestAudioFocus(this, AudioManager.STREAM_MUSIC, | |
AudioManager.AUDIOFOCUS_GAIN); | |
} | |
void endFocus() { | |
AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); | |
audioManager.abandonAudioFocus(this); | |
} | |
@Override | |
public void onAudioFocusChange(int focusChange) { | |
switch (focusChange) { | |
case AudioManager.AUDIOFOCUS_GAIN: | |
// resume playback | |
if (mMediaPlayer == null) initPlayer(); | |
else if (mLostFocus) { | |
mLostFocus = mIsPaused = false; | |
mMediaPlayer.start(); | |
checkProgress(); | |
if(mLastSongUID != null) { | |
Bundle data = new Bundle(); | |
data.putString(Constant.UID, mLastSongUID); | |
PlayerService.this.sendMessage(MSG_EVENT_MEDIA_PLAY_START, -1, -1, data); | |
} | |
} | |
mMediaPlayer.setVolume(1.0f, 1.0f); | |
break; | |
case AudioManager.AUDIOFOCUS_LOSS: | |
// Lost focus for an unbounded amount of time: stop playback and release media player | |
if (mMediaPlayer.isPlaying()) mMediaPlayer.stop(); | |
mMediaPlayer.release(); | |
mMediaPlayer = null; | |
endForeground(); | |
break; | |
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: | |
// Lost focus for a short time, but we have to stop | |
// playback. We don't release the media player because playback | |
// is likely to resume | |
if (mMediaPlayer.isPlaying()) { | |
mMediaPlayer.pause(); | |
cancelCheckProgress(); | |
if(!mMediaPlayer.isPlaying()) { | |
mLostFocus= mIsPaused = true; | |
PlayerService.this.sendMessage(MSG_EVENT_MEDIA_PLAY_PAUSE, -1, -1, null); | |
} | |
} | |
break; | |
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: | |
// Lost focus for a short time, but it's ok to keep playing | |
// at an attenuated level | |
if (mMediaPlayer.isPlaying()) mMediaPlayer.setVolume(0.1f, 0.1f); | |
break; | |
} | |
} | |
//set mLostFocus = false; whenever a command comes to the service e.g. play, pause, next, prev, seek etc |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment