为什么ACTION_CHECK_TTS_DATA意图“难以使用”?

时间:2012-07-18 21:36:35

标签: android text-to-speech

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意图,那是尴尬   使用

     

相反,请执行以下操作:

     
      
  1. 创建TextToSpeech
  2.   
  3. OnInit,检查isLanguageAvailable()如果是,您的应用程序已全部设置。如果没有,请发送ACTION_INSTALL_TTS_DATA
  4.   

如果我理解正确,@ gregm的建议/建议推迟TextToSpeech.LANG_MISSING_DATAonActivityResult()的{​​{1}}支票。

为什么这比formal方法更好?

为什么ACTION_CHECK_TTS_DATA“难以使用”?

1 个答案:

答案 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文档需要改变以推荐这种方法。

如果您仍然不相信我们正在讨论的两种方法都做同样的事情,请查看我有herehere的替代实施方案。此外,如果您不关心所有这些内容,只想让您的应用发言,请延长此Activity并完成。