我正在使用TTS编写应用程序,我可以使用UtteranceProgressListener(不要担心此主题的旧版本)从音乐播放器获得音频焦点,并在演讲结束后重点关注音乐播放器。但应用TTS仍然与谷歌地图(导航器)的声音重叠。
无论如何,我可以判断Map正在讲话,我的声音可以排队,甚至是红脸(因为现在,当他们两个都说话时,我无法辨别/理解他们中的任何一个)。
或者有人可以指出Google Map(或我可以使用的隐藏API)的来源,我了解Google地图不是Android开源的一部分。
以下是我的代码片段:
@TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)
private class utteranceListener extends UtteranceProgressListener {
private OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
// Pause playback
audioManager.abandonAudioFocus(afChangeListener);
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK){
// we don't duck, just abandon focus
audioManager.abandonAudioFocus(afChangeListener);
} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
// Resume playback
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {
audioManager.abandonAudioFocus(afChangeListener);
}
}
};
@Override
public void onDone(String utteranceId)
{
audioManager.abandonAudioFocus(afChangeListener);
}
@Override
public synchronized void onError(String utteranceId)
{
audioManager.abandonAudioFocus(afChangeListener);
}
@Override
public void onStart(String utteranceId)
{
int result = audioManager.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
}
}
顺便说一下,在音乐和TTS上,我比AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK更喜欢老式的AUDIOFOCUS_LOSS_TRANSIENT,一个'躲避'的音乐仍然让(TTS)语音很难听,特别是在播放Rap音乐时,有时只是'一个演讲' /交谈”。
答案 0 :(得分:1)
我已经解决了这个问题,但有一个例外,当谷歌地图正在谈话时,我的代码(下面)仍然会返回AUDIOFOCUS_REQUEST_GRANTED,所以我仍然在这里重叠。
audioManager.requestAudioFocus(afChangeListener, AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
在有效的方面,两个不同的概念 UtterancePrograssListener 适用于由您自己的应用触发的事件,就像您的演讲完成或您的演讲即将开始; OnAudioFocusChangeListener 适用于由其他应用触发的事件,例如谷歌地图从您那里获取音频焦点。
因此,如果我希望让我自己的应用程序在Google地图即将宣布行车路线时停止发言,下面的代码将停止我的谈话:
public void onAudioFocusChange(int focusChange) {
if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT) {
// Someone else has taken over the audio focus,
// abandonAudioFocus() would not do anything.
// you can only stop(), or lower your voice.
tts.stop();
audioManager.abandonAudioFocus(afChangeListener);
} else if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK){
// this is what Google Map actually triggers
tts.stop();
audioManager.abandonAudioFocus(afChangeListener);
}
.....