我正在使用TTS打电话给应用程序说出来电者姓名。我想在TTS讲话时暂停铃声然后恢复铃声。根据我的研究,我们可以使用AudioFocus
(希望如此)。
无论如何,我使用以下代码
更新
我现在正在使用此代码。
public void speak(final String talk) throws InterruptedException {
final AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
int musicVolume= audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicVolume, 0);
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
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
audioManager.setRingerMode(AudioManager.RINGER_MODE_NORMAL);
System.out.println("done");
}
});
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);
}
虽然Ringtone
已停止且tts
已播放但播放tts
后Ringtone
未恢复。我该怎么办?
答案 0 :(得分:8)
最后在我挠了头两天之后我终于做到了。对于那些想要实现这样的但却无法实现的人来说,这里是代码
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
- 获取手机中设置的铃声 .i.e铃声音量的当前音量。
musicVolume
- 获取音乐
currentRingVolume
只保留ringVolume
。
注意 - STREAM_RING
和STREAM_MUSIC
是不同的事情。请参阅
现在基本的想法是mute
ringtone
而TTS
正在发言,然后将其设置为之前的值。
seekBarValue
- 是我的SeekBar
,它描述了TTS
卷w.r.t musicVolume
的级别,并且是可选的。
PauseRingtone
- 是CheckBox Preference
,它会检查我们是否要在讲话时暂停铃声。如果true
将AudioManager.STREAM_RING
设置为1
,即vibrate
其他ringVolume
即Phone Value
,那么TTS
和{{1}同时玩。
Ringtone
将audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,musicVolume, 0)
的音量设为TTS
。在musicVolume
完成发言后,即在TTS
中,我们使用onDone()
将Ringtone
的卷设置回ringVolume
。
如果我的回答有助于我的答案有用。
答案 1 :(得分:1)
摆脱此焦点侦听器并添加此代码phoneStateListener类。这将解决您的问题。
int mode = audioManager.getRingerMode();
int musicVolume= audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC, musicVolume, 0);
audioManager.setRingerMode(AudioManager.RINGER_MODE_SILENT);
if(phoneState == TelephonyManager.CALL_STATE_IDLE)
{
audioManager.setRingerMode(mode);
}