2010-10-09 2 views
5

Я реализовал интеграцию TextToSpeech, как указано в this blog post. После того, как я добавил его в свою программу, он теперь мешает моим другим intent.SpeechToText и запуск намерения ACTION_CHECK_TTS_DATA

Например:

  1. Элемент списка
  2. Пользователь запускает App
  3. Пользователь вызывает Активность в нагрузку
  4. Пользователь выбирает файл для загрузки, и возвращает активность fileanme для загрузки намерения
  5. Основная деятельность начинается, и он понимает, что ей необходимо загрузить имя файла, чтобы оно начиналось так.
  6. Проверка TTS должна быть выполнена, чтобы я был lau нч ACTION_CHECK_TTS_DATA намерение
  7. Это останавливает основную деятельность снова и процесс загрузки прерывается
  8. При возврате проверки TTS, загрузка не произошло.

Когда мне нужна эта проверка TTS? Могу ли я просто сделать это один раз при запуске приложения? Это заставляет мое приложение загружаться медленно. Я бы хотел, чтобы эта загрузка выполнялась в отдельном потоке, если это было возможно.

ответ

8

Сделайте чек один раз. Как только данные будут установлены, очень маловероятно, что пользователю придется когда-либо делать это снова. Как только данные будут установлены, пользователю не удастся его удалить, даже если они этого захотят.

Также не используйте ACTION_CHECK_TTS_DATA Intent, это неудобно использовать.

Вместо этого сделайте следующее:

  1. Создать TextToSpeech
  2. OnInit, проверьте isLanguageAvailable() , если это, ваше приложение все готово. если нет, то отправьте ACTION_INSTALL_TTS_DATA

Вот код, который инициализирует TextToSpeech в том, как я предлагаю. В качестве бонуса он также устанавливает язык.

public class DemoCreateTTS 
{ 
    private static final String TAG = "DemoCreateTTS"; 

    private TextToSpeech tts; 

    public void createTextToSpeech(final Context context, 
      final Locale locale) 
    { 
     tts = new TextToSpeech(context, new OnInitListener() 
     { 
      @Override 
      public void onInit(int status) 
      { 
       if (status == TextToSpeech.SUCCESS) 
       { 
        Locale defaultOrPassedIn = locale; 
        if (locale == null) 
        { 
         defaultOrPassedIn = Locale.getDefault(); 
        } 
        // check if language is available 
        switch (tts.isLanguageAvailable(defaultOrPassedIn)) 
        { 
         case TextToSpeech.LANG_AVAILABLE: 
         case TextToSpeech.LANG_COUNTRY_AVAILABLE: 
         case TextToSpeech.LANG_COUNTRY_VAR_AVAILABLE: 
          Log.d(TAG, "SUPPORTED"); 
          tts.setLanguage(locale); 
          //pass the tts back to the main 
          //activity for use 
          break; 
         case TextToSpeech.LANG_MISSING_DATA: 
          Log.d(TAG, "MISSING_DATA"); 
           Log.d(TAG, "require data..."); 
           Intent installIntent = new Intent(); 
           installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
           context.startActivity(installIntent); 
          break; 
         case TextToSpeech.LANG_NOT_SUPPORTED: 
          Log.d(TAG, "NOT SUPPORTED"); 
          break; 
        } 
       } 
      } 
     }); 
    } 
} 
+0

Я сделал что-то похожее на то, что вы упомянули. благодаря! – swinefeaster

+0

@gregm [Почему] (http://stackoverflow.com/q/11550746/636571) - это намерение ACTION_CHECK_TTS_DATA «неудобно использовать»? Спасибо +1. – an00b

+0

Здравствуйте, я тестировал использование isLanguageAvailable, но это не дает желаемого результата. Например, корейские речевые данные не установлены. Однако, когда я вызывал isLanguageAvailable в корейских речевых данных, когда он не загружен, он просто возвращает LANG_COUNTRY_AVAILABLE, что тоже правильно. Локаль доступен для движка только для голосовых данных, которые еще не загружены. Однако из-за этого я никогда не могу проверить, загружены ли голосовые данные или нет, так как я никогда не получаю LANG_MISSING_DATA. Является ли решение более неприменимым? Благодаря! –

Смежные вопросы