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
.