private static int changedFocus;
private static boolean focusGranted;
private static AudioManager audioManager;
public static int getChangedFocus() {
return changedFocus;
}
public static boolean isFocusGranted() {
return focusGranted;
}
public static void requestFocus(final Context context) {
if (audioManager == null) {
audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
}
switch (audioManager.requestAudioFocus(OnFocusChangeListener.getInstance(),
AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN)) {
case AudioManager.AUDIOFOCUS_REQUEST_GRANTED:
focusGranted = true;
break;
case AudioManager.AUDIOFOCUS_REQUEST_FAILED:
focusGranted = false;
break;
}
}
private static final class OnFocusChangeListener implements AudioManager.OnAudioFocusChangeListener {
private static OnFocusChangeListener instance;
protected static OnFocusChangeListener getInstance() {
if (instance == null) {
instance = new OnFocusChangeListener();
}
return instance;
}
@Override
public void onAudioFocusChange(final int focusChange) {
changedFocus = focusChange;
System.out.println("on focus change: " + focusChange);
switch (focusChange) {
case AudioManager.AUDIOFOCUS_GAIN:
GlobalMusicPlayer.onFocusGained();
break;
case AudioManager.AUDIOFOCUS_LOSS:
GlobalMusicPlayer.onFocusLoss();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
GlobalMusicPlayer.onFocusLossTransient();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
GlobalMusicPlayer.onFocusLossTransientCanDuck();
break;
}
}
}
I call requestFocus(context) and get AudioManager.AUDIOFOCUS_REQUEST_GRANTED as a return value.
After that, onAudioFocusChange never called and thus changedFocus is always 0.
isFocusGranted() // true
getChangedFocus() // 0
Devices: Nexus 10, Motorola Xoom.
case AudioManager.AUDIOFOCUS_GAIN
in onAudioFocusChange()
is more of an AudioFocus re-gain. It only gets triggered after the lost event.
case AudioManager.AUDIOFOCUS_REQUEST_GRANTED
is where you should add another GlobalMusicPlayer.onFocusGained()
.