终于在折腾了两天之后我终于做到了。对于所有想要实现类似的东西但无法这样做的人,这里是代码
public void speak(final String talk) throws InterruptedException {
final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int ringVolume = audioManager
.getStreamVolume(AudioManager.STREAM_RING);
int musicVolume = audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
currentRingVolume = ringVolume;
musicVolume = (int) ((musicVolume * seekbarValue) / 100);
if (PauseRingtone == true) {
audioManager.setStreamVolume(AudioManager.STREAM_RING, 1,
AudioManager.FLAG_SHOW_UI);
} else {
audioManager.setStreamVolume(AudioManager.STREAM_RING,
ringVolume, AudioManager.FLAG_SHOW_UI);
}
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicVolume, 0);
int result = tts
.setOnUtteranceProgressListener(new UtteranceProgressListener() {
@Override
public void onStart(String utteranceId) {
// TODO Auto-generated method stub
}
@Override
public void onError(String utteranceId) {
// TODO Auto-generated method stub
}
@Override
public void onDone(String utteranceId) {
// TODO Auto-generated method stub
System.out.println("done");
audioManager.setStreamVolume(AudioManager.STREAM_RING,
currentRingVolume, 0);
}
});
HashMap<String, String> params = new HashMap<String, String>();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "stringId");
tts.speak(talk, TextToSpeech.QUEUE_FLUSH, params);
System.out.println("speaking after tts is over" + talk + " " + result);
}
解释 :-
ringVolume
- 获取当前音量ringtone.即手机中设置的铃声音量。
musicVolume
- 获取当前音量music
currentRingVolume
只是保留了ringVolume
.
Note- STREAM_RING
and STREAM_MUSIC
are different things. See
现在的基本想法是mute
the ringtone
while TTS
正在说话,然后将其设置为先前的值。
seekBarValue
- is my SeekBar
它描绘了的水平TTS
体积 w.r.tmusicVolume
并且是可选的。
PauseRingtone
- is a CheckBox Preference
它检查我们是否要在说话时暂停铃声。如果true
是设置AudioManager.STREAM_RING
to 1
i.e. vibrate
else ringVolume
i.e. Phone Value
,所以两者TTS
and Ringtone
同时玩。
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,musicVolume, 0)
设置音量TTS
to musicVolume
. After TTS
已完成讲话,即在onDone()
我们设置音量Ringtone
回到ringVolume
using currentRingVolume
.
如果我的答案有帮助,则标记我的答案有用。