Search code examples
androidandroid-audiomanager

onAudioFocusChange not called


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.


Solution

  • 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().