TTS не говорит из службы, в то время как он делает это из активности в Android - PullRequest
0 голосов
/ 17 января 2011

Мне удалось запустить TTS из действия, но когда я пытаюсь выполнить тот же код из службы, он сообщает мне, что механизм TTS инициализирован, но ничего не говорит.

Кто-нибудь сталкивался ста же проблема в любое время?

 public void onCreate() {

    super.onCreate();
    tts = new TextToSpeech(this, this //TextToSpeech.OnInitListener);

    timer.scheduleAtFixedRate( new TimerTask()                       
    {                                   // In timer

          public void run() {
          //On some condition
          tts.speak("thank you", TextToSpeech.QUEUE_ADD, null);
     }, 0, 60000);
    }

  @Override
  public void onInit(int status) {  
  if (status == TextToSpeech.SUCCESS) {
  Toast.makeText(BackgroundProcessforTimecheck.this, 
  "Text-To-Speech engine is initialized", Toast.LENGTH_LONG).show();
 }
 else if (status == TextToSpeech.ERROR) {
  Toast.makeText(BackgroundProcessforTimecheck.this, 
  "Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show();
}
}

Кто-нибудь может помочь, пожалуйста?

Ответы [ 2 ]

6 голосов
/ 28 января 2011

У меня была та же проблема, и я решил ее следующим образом: создание объекта 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();
}}
0 голосов
/ 17 января 2013

Установили ли вы двигатель TTS на вашем устройстве.Я тоже столкнулся с той же проблемой с тем же сообщением.Но позже я обнаружил, что мне нужно установить движок TTS на мое реальное устройство, и он доступен в магазине игр.

...