I implemented the text to speech in language "Hindi" Its an Indian language my application which is working fine till the API level 29. Its working fine for English but not for the Hindi. But in new devices which are of API level 30, it's not working. in debugging its giving result value -2 "language no supported error" in API level 30 devices.
private void setTextTospeech() {
textToSpeech = new TextToSpeech(mContext, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
if (language.toLowerCase().contains(langaugeCodeEnglish)) {
int result = textToSpeech.setLanguage(new Locale("en", "IN"));
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
//Toast.makeText(mContext, result + " is not supported", Toast.LENGTH_SHORT).show();
Log.e("Text2SpeechWidget", result + " is not supported");
}
} else {
int result = textToSpeech.setLanguage(new Locale("hi", "IN"));
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
textToSpeech.setLanguage(Locale.forLanguageTag("hin"));
} else {
// Toast.makeText(mContext, result + "Language is not supported", Toast.LENGTH_SHORT).show();
Log.e("Text2SpeechWidget", result + "Language is not supported");
}
Log.e("Text2SpeechWidget", result + " is not supported");
}
}
}
}
});
}
private void speak(String s, String text) {
try{
float pitch = (float) 0.62;
float speed = (float) 0.86;
textToSpeech.setSpeechRate(speed);
textToSpeech.setPitch(pitch);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Bundle bundle = new Bundle();
bundle.putInt(TextToSpeech.Engine.KEY_PARAM_STREAM, AudioManager.STREAM_MUSIC);
textToSpeech.speak(s, TextToSpeech.QUEUE_FLUSH, bundle, null);
textToSpeech.speak(text, TextToSpeech.QUEUE_ADD, bundle, null);
} else {
HashMap<String, String> param = new HashMap<>();
param.put(TextToSpeech.Engine.KEY_PARAM_STREAM, String.valueOf(AudioManager.STREAM_MUSIC));
textToSpeech.speak(s, TextToSpeech.QUEUE_FLUSH, param);
textToSpeech.speak(text, TextToSpeech.QUEUE_ADD, param);
}
}catch (Exception ae){
ae.printStackTrace();
}
}
As per new docs. I also add a queries tag inside manifest tag.
<queries>
...
<intent>
<action android:name="android.intent.action.TTS_SERVICE" />
</intent>
</queries>
Add the following permission in the manifest file;
uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
Thank you Mustafa Balin
android studio made me change it a bit though.
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With