【问题标题】:TextToSpeech initialization on Android -- what if it fails?Android 上的 TextToSpeech 初始化——如果失败了怎么办?
【发布时间】:2018-10-21 11:49:39
【问题描述】:

在 Android 中,如果 TextToSpeech 实例初始化失败(指示 TextToSpeech 引擎初始化完成的回调调用返回 TextToSpeech.ERROR),这是否意味着随后尝试对该实例的方法调用将导致空指针异常?

示例...

我们初始化对象:

t1 = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if (status == TextToSpeech.ERROR) {
                    Log.i("XXX", "There was an error initializing the TTS");
                }
            }
        });

...假设 init 失败,但我们继续执行以下操作:

t1.speak("hello");

这会崩溃……还是什么都不说?我问的原因是,如果它确实崩溃了,那么显然我将不得不在任何地方进行空检查。

另外,我不能自己找出原因是我不知道如何模拟错误。

感谢任何先前的知识。

【问题讨论】:

  • 你应该显示错误 logcat
  • 我没有遇到错误。我认为你没有理解这个问题。
  • @MeosCoder 没有崩溃。你不明白这个问题,他在问如果发生错误会发生什么,但他自己不能触发错误行为。

标签: java android constructor text-to-speech initializer


【解决方案1】:

对于您的主要问题,请阅读 speak() 方法 (here) 的文档:

此方法是异步的,即该方法只是将请求添加到 TTS 请求队列,然后返回。

因此,除非您的 tts 实例是 null,否则它不应抛出任何异常或使应用程序崩溃,而只是返回错误代码。

另外,我不能自己找出原因是我不知道如何模拟错误。

尝试使用构造函数 (see docs) 作为第三个参数 String engine 并将无效的包名称放在那里。那么它应该可能会导致错误。 (或禁用/卸载设备/模拟器上的所有 TTS 引擎)

关于构造函数需要注意的重要一点是:

如果发生故障,可以在完全构造 TextToSpeech 实例之前立即调用侦听器。

所以除非状态是SUCCESS,否则你不应该在监听器中触摸你的tts(当然你可以在你的例子中使用tts),因为它可能甚至还没有被分配/初始化。

【讨论】:

    【解决方案2】:

    我遇到了这个问题,然后我注意到在某些设备上 TTS 可能已停用。所以我刚刚做了以下

    try {
            Intent intent = new Intent();
            intent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
            startActivityForResult(intent, 0);
        } catch(ActivityNotFoundException exception) {
            Uri uri = Uri.parse("market://details?id=" + "com.google.android.tts&hl=fr");
            Intent goToMarket = new Intent(Intent.ACTION_VIEW, uri);
            goToMarket.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
            try {
                startActivity(goToMarket);
            } catch (ActivityNotFoundException e) {
                startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://play.google.com/store/apps/details?id=" + "com.google.android.tts&hl=fr")));
            }
        } 
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用此代码。

      使用https://www.w3schools.com/tags/ref_language_codes.asp 中的language_codes。

      mLanguage = new Locale(language_codes);
      
      tts = new TextToSpeech(mContext, new TextToSpeech.OnInitListener() {
              @Override
              public void onInit(int status) {
                  if (status != TextToSpeech.ERROR) {
                      int result = tts.setLanguage(mLanguage);
                      if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
                          Log.e("Text2SpeechWidget", result + " is not supported");
                      }
                  }
              }
          });
      

      【讨论】:

        猜你喜欢
        • 2011-06-14
        • 2012-08-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-26
        • 1970-01-01
        • 2019-02-10
        • 2013-02-26
        • 2010-12-31
        相关资源
        最近更新 更多