在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");
这会崩溃......还是什么都不说?我问的原因是,如果它崩溃了,那么显然我必须在任何地方进行空检查。
另外,我无法找到自己的原因是我不知道如何模拟错误。
感谢任何先前的知识。
答案 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");
}
}
}
});