4

Android 中 Text-To-Speech的官方介绍说:“在创建活动时,好的第一步是检查是否存在具有相应意图的 TTS 资源:”

Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);

但是此线程中的@gregm另有建议:

另外,不要使用 ACTION_CHECK_TTS_DATA Intent,这样使用起来很尴尬

相反,请执行以下操作:

  1. 创建文本转语音
  2. OnInit,检查 isLanguageAvailable() 如果是,您的应用程序已全部设置。如果没有,发送 ACTION_INSTALL_TTS_DATA

如果我理解正确,@gregm 所做/建议的是将检查推迟到.TextToSpeech.LANG_MISSING_DATAonActivityResult()onInit()

为什么这比正式的方法更好?

为什么 ACTION_CHECK_TTS_DATA 如此“难用”?

4

1 回答 1

8

这是@gregm。

ACTION_CHECK_TTS_DATA需要更复杂的执行和更多的代码,但做的事情与TextToSpeech.isLanguageAvailable()让我解释一下:

1) 使用时需要两个异步进程ACTION_INSTALL_TTS_DATA。首先,启动Intent并接收结果。其次,当您的应用程序正在等待时,等待TextToSpeech调用More 可能会出错。onInit()

2)您要做的就是执行一个 if 语句,如果需要,您需要相同的代码来处理安装语言数据,那么为什么还要增加额外的复杂性呢?

归结为这样做:

你想要1行代码:

if (TextToSpeech.isLanguageAvailable())
{
 (same tts init code here)
}

或 >1 行代码,例如:

Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);

public void onActivityResult(...)
{
 if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS)
 (same tts init code here)
}

在我看来,我宁愿只使用 if 语句,而不是使用Intentrunaround。我相信官方 Android 文档需要更改以推荐这种方法。

如果你仍然不相信我们讨论的两种方法做同样的事情,请查看我在这里这里的替代实现。另外,如果你不关心所有这些东西,只是想让你的应用程序说话,只需扩展这个Activity并完成。

于 2012-07-19T15:43:47.257 回答