AUDIOFOCUS_LOSS вызывается после телефонного звонка в android

Я пытаюсь сделать паузу в медиаплеерах, когда звонит телефон. Я использую образец кода с сайта android. Это так:

public void onAudioFocusChange(int focusChange) {
        switch (focusChange) {
        case AudioManager.AUDIOFOCUS_GAIN:
            // resume playback
            if (mMediaPlayer != null && !mMediaPlayer.isPlaying()) {
                mMediaPlayer.start();
                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
            stopMediaPlayer();
            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();
            break;

        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
            // Lost focus for a short time, but it ok to keep playing
            // at an attenuated level
            if (mMediaPlayer.isPlaying())
                mMediaPlayer.setVolume(0.1f, 0.1f);
            break;
        }
    }

Когда телефон звонит, AUDIOFOCUS_LOSS_TRANSIENT отправляется; это нормально. И когда вызов заканчивается, AUDIOFOCUS_GAIN отправляется, и игрок продолжает играть; что тоже хорошо. Но сразу после отправки AUDIOFOCUS_GAIN отправляется AUDIOFOCUS_LOSS. Есть идеи, почему они теряют фокус аудио? спасибо заранее.

Ответ 1

Две вещи для проверки: 1) У вас есть кнопка воспроизведения, например, при нажатии, запросы фокусируются и начинают воспроизведение? У меня возникла проблема, когда они сыграли звук "тика", чтобы обеспечить обратную связь с кликом. Когда это произошло, они уберут фокус от моего приложения. В вашем XML установите это значение равным false для всех ваших кнопок в этом действии:

android:soundEffectsEnabled = 'false'

2) Проверьте установку других приложений медиаплеера, которые также запрашивают фокус. Они запрашивают фокус сразу после его потери? Если это не так, вы можете сделать это иначе, чем предупреждать своих пользователей о том, чтобы не устанавливать это приложение.

Ответ 2

Возможно, это поможет кому-то. У меня была эта проблема, когда в проекте не использовался напрямую MediaPlayer, а через VideoView. Он имеет следующий код при открытии файла

AudioManager am = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

Итак, когда вы открываете файл, он получает аудиофокус и слушатель, который установлен перед тем, как запускается с помощью focusChange AudioManager.AUDIOFOCUS_LOSS.