Reputation: 1060
I've a viewpager in my application. When the user swipes to the right/left I use TTS engine to speak the text and MediaPlayer to play a sound.
The problem is both plays simultaneously.. How do I play the sound once TTS engine speaks the text is over?
P.S: I don't want to use sleep or wait.
Update:
Here is my code:
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
if (result == TextToSpeech.LANG_MISSING_DATA
|| result == TextToSpeech.LANG_NOT_SUPPORTED) {
} else {
//Do Something here
}
if(Build.VERSION.SDK_INT >= 15 ){
UtteranceProgressListener listener = 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
//start MediaPlayer
playMedia(viewPager.getCurrentItem());
}
};
tts.setOnUtteranceProgressListener(listener);
}
else{
tts.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener(){
@Override
public void onUtteranceCompleted(String arg0) {
playMedia(viewPager.getCurrentItem());
}
});
}
} else {
Intent installIntent = new Intent();
installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
Upvotes: 1
Views: 1709
Reputation: 576
You have to give it an id param. Otherwise it doesn't call the listeners:
HashMap<String, String> params = new HashMap<String, String>();
params.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID,"stringId");
textToSpeech.speak(string,TextToSpeech.QUEUE_ADD, params);
Upvotes: 6
Reputation: 9276
In android their are two APIs to detect if the TTS engine finished speaking:
> Android 4 (ICS)
UtteranceProgressListener listener = 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
//start MediaPlayer
}
};
yourTTSObject.setOnUtteranceProgressListener(listener);
Perior to ICS Android 4.0 you can use :
yourTTSObject.setOnUtteranceCompletedListener(new OnUtteranceCompletedListener(){
@Override
public void onUtteranceCompleted(String arg0) {
// start your mediaplayer here
}
});
take a look at the documentations here
Upvotes: 2