2012-07-18 30 views
4

official介绍文本到语音Android中说:“在创建活动中,良好的第一步是检查的TTS资源的存在与相应的意图:”为什么ACTION_CHECK_TTS_DATA意图“尴尬地使用”?

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

但@ gregm在this thread表明并非如此:

另外,不要使用ACTION_CHECK_TTS_DATA意图,这是尴尬 使用

相反,做到以下几点:

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

如果我理解正确的话,@gregm做什么/顾名思义就是延迟TextToSpeech.LANG_MISSING_DATA检查从onActivityResult()onInit()

为什么这比formal方法更好?

为什么ACTION_CHECK_TTS_DATA如此“难以使用”?

回答

9

这是@gregm。

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

1)当您使用ACTION_INSTALL_TTS_DATA你需要两个异步进程。首先,启动一个Intent并收到结果。其次,等待TextToSpeech致电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语句,而不是使用Intent周转。我相信官方的Android文档需要改变以推荐这种方法。

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

+0

谢谢!在获得您的许可的情况下,我强调了**为什么会增加额外的复杂性?**这实质上是答案的关键。我想确保我不会错过那些会使应用程序无法正常工作的问题,如果采用“正式”方法。 +1和接受。 – an00b 2012-07-19 23:03:33

+2

你好,我使用isLanguageAvailable进行了测试,但它没有给出所需的结果。例如,韩语的语音数据没有安装。然而,当我没有下载时调用韩语语音数据上的isLanguageAvailable,它只是返回LANG_COUNTRY_AVAILABLE,这也是正确的。只有语音数据尚未下载,语言环境才可用于引擎。但是,由于这个原因,我无法检查是否下载语音数据,因为我从来没有收到过LANG_MISSING_DATA。该解决方案不再适用?谢谢! – 2017-06-18 16:00:52

+2

要添加到它,LANG_COUNTRY_AVAILABLE并不表示语音数据已下载,它只是表明它支持并且可以下载。 – 2017-06-18 16:03:12