为什么ACTION_CHECK_TTS_DATA意图"难以使用"?

an0*_*00b 4 android text-to-speech

负责人介绍文本到语音Android中说:"在创建活动中,良好的第一步是检查是否与相应的意图TTS资源的存在:"

Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
Run Code Online (Sandbox Code Playgroud)

但是@gregm在这个帖子中暗示:

另外,不要使用ACTION_CHECK_TTS_DATA Intent,这很难使用.

相反,请执行以下操作:

  1. 创建TextToSpeech
  2. OnInit,检查isLanguageAvailable(),如果是,你的应用程序都已设置好.如果没有,发送ACTION_INSTALL_TTS_DATA

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

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

为什么ACTION_CHECK_TTS_DATA如此"难以使用"?

gre*_*egm 8

这是@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)
}
Run Code Online (Sandbox Code Playgroud)

或> 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)
}
Run Code Online (Sandbox Code Playgroud)

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

如果您仍然不相信我们正在讨论的两种方法都做同样的事情,请查看我在这里这里的替代实现.此外,如果您不关心所有这些内容并且只是希望您的应用发言,请延长此活动并完成.

  • 您好,我使用isLanguageAvailable测试过,但它没有给出所需的结果.例如,未安装韩语的语音数据.然而,当我没有下载韩语语音数据时,我打电话给isLanguageAvailable时,它只返回LANG_COUNTRY_AVAILABLE,这也是正确的.语言环境仅适用于引擎,而尚未下载的语音数据.但是,由于这个原因,我永远无法检查是否下载了语音数据,因为我永远不会得到LANG_MISSING_DATA.该解决方案不再适用吗?谢谢! (3认同)
  • 要添加它,LANG_COUNTRY_AVAILABLE不表示语音数据已下载,它只表示支持并可以下载. (3认同)