Android中的official文字转语言简介说“在创建活动时,第一步是检查TTS资源是否存在以及相应的意图:”
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
但this thread中的@gregm暗示:
另外,不要使用ACTION_CHECK_TTS_DATA意图,那是尴尬 使用
相反,请执行以下操作:
- 创建TextToSpeech
- OnInit,检查isLanguageAvailable()如果是,您的应用程序已全部设置。如果没有,请发送ACTION_INSTALL_TTS_DATA
醇>
如果我理解正确,@ gregm的建议/建议推迟从TextToSpeech.LANG_MISSING_DATA
到onActivityResult()
的{{1}}支票。
为什么这比formal方法更好?
为什么ACTION_CHECK_TTS_DATA“难以使用”?
答案 0 :(得分:9)
这是@gregm。
ACTION_CHECK_TTS_DATA
需要更复杂的执行和更多代码,但与TextToSpeech.isLanguageAvailable()
做同样的事情让我解释一下:
1)使用ACTION_INSTALL_TTS_DATA
时需要两个异步进程。首先,启动Intent
并接收结果。其次,等待TextToSpeech
拨打onInit()
当您的应用正在等待所有等待时,可能会出现更多问题。
2)你要做的就是执行if语句,如果需要,你需要相同的代码来处理语言数据的安装,所以为什么要增加额外的复杂性?
归结为:
您想要一行代码:
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语句,而不是使用Intent
runaround。我相信官方的Android文档需要改变以推荐这种方法。
如果您仍然不相信我们正在讨论的两种方法都做同样的事情,请查看我有here和here的替代实施方案。此外,如果您不关心所有这些内容,只想让您的应用发言,请延长此Activity并完成。