Pause Phone Ringtone while Speaking through Text To Speech and then Resume
android, android-audiomanager, ringtone, text-to-speech
Solution
Finally after scratching my head for two days i finally did it. For all those who want to implement something like this but are unable to do so here is the code
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);
}
explaination :-
`ringVolume` - gets the current volume of the ringtone .i.e ringtone volume set in the phone.
`musicVolume` - gets the current volume of the music
`currentRingVolume` just retains the `ringVolume`.
Note- `STREAM_RING` and `STREAM_MUSIC` are different things. See
Now the basic idea is to `mute` the `ringtone` while `TTS` is speaking and then set it to previous value.
`seekBarValue`- is my `SeekBar` which depicts the level of the `TTS` volume w.r.t `musicVolume` and is optional.
`PauseRingtone`- is a `CheckBox Preference` which checks whether we want to pause ringtone while speaking. If `true` is sets the `AudioManager.STREAM_RING` to `1` i.e. `vibrate` else `ringVolume` i.e. `Phone Value`, so both `TTS` and `Ringtone` play at the same time.
audioManager.setStreamVolume(AudioManager.STREAM_MUSIC,musicVolume, 0)
sets the volume of `TTS` to `musicVolume`. After `TTS` has completed speaking i.e. in `onDone()` we set the volume of `Ringtone` back to the `ringVolume` using `currentRingVolume`.
If my answer helped mark my answer useful.
Problem
I am making a caller speaking application which speak caller name using TTS. I want to pause the ringtone while TTS is speaking then resuming the ringtone. From what i have researched we can use `AudioFocus` (hope so). Anyway i am using the following code Update I am using this code now. ``` 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); } ``` Although the `Ringtone` is stopped and `tts` is played but after `tts` is played `Ringtone` is not resumed. What should i do?