Я изначально выбрал тот же маршрут для этой проблемы, но решение состоит в том, чтобы использовать AudioManager, а не SpeechRecognizer.
Наше приложение уже использовало пользовательский прослушиватель для AudioManager.OnAudioFocusChangeListener и правильно отвечало на состояния AUDIOFOCUS_GAIN и AUDIOFOCUS_LOSS. Оказывается, что голосовой поиск вызывает состояние AUDIOFOCUS_LOSS_TRANSIENT, поэтому добавление этого к слушателю изменений привело к приостановке воспроизведения во время выполнения голосового поиска.
Подведем итог:
Создать слушателя
AudioManager.OnAudioFocusChangeListener audioFocusListener =
new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
Logging.d(TAG, "audiofocus change");
if(focusChange == AudioManager.AUDIOFOCUS_LOSS || focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT)
suspendPlayback();
if(focusChange == AudioManager.AUDIOFOCUS_GAIN)
resumePlayback();
}
};
Получить AudioManager, запросить фокус и передать слушателю
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);
int result = audioManager.requestAudioFocus(audioFocusListener, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);