У меня была та же проблема, и я решил ее следующим образом: создание объекта TextToSpeech в отдельном классе (в моем случае я также использую Factory для проверки, является ли версия Android хотя бы Donut), и повторно его использую (см. метод init (Контекстный контекст)).Обратите внимание, что onInit (int-статус) далеко не готов к выпуску.
Сервис:
@Override
public void onStart(Intent intent, int startId) {
Context context = getApplicationContext();
TtsProviderFactory ttsProviderImpl = TtsProviderFactory.getInstance();
if (ttsProviderImpl != null) {
ttsProviderImpl.init(context);
ttsProviderImpl.say("hope that helps);
}}
Завод:
public abstract class TtsProviderFactory {
public abstract void say(String sayThis);
public abstract void init(Context context);
public abstract void shutdown();
private static TtsProviderFactory sInstance;
public static TtsProviderFactory getInstance() {
if (sInstance == null) {
int sdkVersion = Integer.parseInt(Build.VERSION.SDK);
if (sdkVersion < Build.VERSION_CODES.DONUT) {
return null;
}
try {
String className = "TtsProviderImpl";
Class<? extends TtsProviderFactory> clazz =
Class.forName(TtsProviderFactory.class.getPackage().getName() + "." + className)
.asSubclass(TtsProviderFactory.class);
sInstance = clazz.newInstance();
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
return sInstance;
}}
Реализация:
public class TtsProviderImpl extends TtsProviderFactory implements TextToSpeech.OnInitListener {
private TextToSpeech tts;
public void init(Context context) {
if (tts == null) {
tts = new TextToSpeech(context, this);
}
}
@Override
public void say(String sayThis) {
tts.speak(sayThis, TextToSpeech.QUEUE_FLUSH, null);
}
@Override
public void onInit(int status) {
Locale loc = new Locale("de", "", "");
if (tts.isLanguageAvailable(loc) >= TextToSpeech.LANG_AVAILABLE) {
tts.setLanguage(loc);
}
}
public void shutdown() {
tts.shutdown();
}}