Android上的TextToSpeech初始化 - 如果失败怎么办?

时间:2018-05-11 06:00:45

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

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

示例...

我们初始化对象:

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");

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

另外,我无法找到自己的原因是我不知道如何模拟错误。

感谢任何先前的知识。

3 个答案:

答案 0 :(得分:1)

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

  

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

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

  

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

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

关于构造函数的重要注意事项是:

  

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

因此,除非状态为SUCCESS,否则您不应触及聆听者中的tts (当然,您之后可以使用tts你的例子)因为它甚至可能都没有被分配/初始化。

答案 1 :(得分:1)

我遇到了这个问题,然后我发现在某些设备上,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")));
        }
    } 

答案 2 :(得分:0)

您可以尝试使用此代码。

使用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");
                }
            }
        }
    });