TextToSpeech with API 21

Jose Borges picture Jose Borges · Jan 15, 2015 · Viewed 26.2k times · Source

Can someone help me using TTS with API 21. All examples available are deprecated with version 21

Here's my code giving error on last line:

Calendar cal = Calendar.getInstance();
                    cal.getTime();
                    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
                    String text = sdf.toString();
                    btn.setText("Ouvir as Horas");

                    TextToSpeech tts = new TextToSpeech(NightClock.this,(TextToSpeech.OnInitListener) NightClock.this);
                    tts.setLanguage(Locale.US);
                    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);

In Android developers it says that this method is deprecated and replaced by this:

speak(String text, int queueMode, HashMap params) This method was deprecated in API level 21. As of API level 21, replaced by speak(CharSequence, int, Bundle, String).

Can someone help to code my app.

Answer

xanadu6291 picture xanadu6291 · Apr 21, 2015

I searched various site. Finally, I think I could get the answer for your Question...

Instead calling tts.speak() directly, put the following if-else statement.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    ttsGreater21(text);
} else {
    ttsUnder20(text);
}

Then declare ttsGreater21() and ttsUnder20() as follows.

@SuppressWarnings("deprecation")
private void ttsUnder20(String text) {
    HashMap<String, String> map = new HashMap<>();
    map.put(TextToSpeech.Engine.KEY_PARAM_UTTERANCE_ID, "MessageId");
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, map);
}

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void ttsGreater21(String text) {
    String utteranceId=this.hashCode() + "";
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null, utteranceId);
}

I confirmed above code with Genymotion VM Android 5.0 and Android 4.4.4.