Android 为什么要采取“检查数据意图”的行动;难以使用;?

Android 为什么要采取“检查数据意图”的行动;难以使用;?,android,text-to-speech,Android,Text To Speech,Android中文本到语音的介绍中说,“在创建活动时,一个好的第一步是检查TTS资源是否具有相应的意图:” 但@gregm in提出了不同的建议: 另外,不要使用ACTION\u CHECK\u TTS\u DATA Intent,这样做会让人感到尴尬 使用 相反,请执行以下操作: 创建TextToSpeech OnInit,检查isLanguageAvailable(),如果是,则表明您的应用程序已全部设置。如果没有,则发送操作\u安装\u TTS\u数据 如果我理解正确,@gregm所做/建

Android中文本到语音的介绍中说,“在创建活动时,一个好的第一步是检查TTS资源是否具有相应的意图:”

但@gregm in提出了不同的建议:

另外,不要使用ACTION\u CHECK\u TTS\u DATA Intent,这样做会让人感到尴尬 使用

相反,请执行以下操作:

  • 创建TextToSpeech
  • OnInit,检查isLanguageAvailable(),如果是,则表明您的应用程序已全部设置。如果没有,则发送操作\u安装\u TTS\u数据
  • 如果我理解正确,@gregm所做/建议的是将
    TextToSpeech.LANG\u MISSING\u DATA
    检查从
    onActivityResult()
    推迟到
    onInit()

    为什么这比这种方法更好

    为什么ACTION\u CHECK\u TTS\u数据如此“难以使用”?

    这是@gregm

    ACTION\u CHECK\u TTS\u DATA
    需要更复杂的执行和更多的代码,但与
    TextToSpeech.isLanguageAvailable()
    的功能相同,让我解释一下:

    1) 使用
    操作\u安装\u TTS\u数据时,需要两个异步进程。首先,启动
    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的官方文档需要修改以推荐这种方法


    如果您仍然不相信我们正在讨论的两种方法都能做相同的事情,请查看我的替代实现和。另外,如果你不在乎这些东西,只想让你的应用程序说话,就扩展它,完成它。

    谢谢!如果您允许,我将强调为什么要增加额外的复杂性?这基本上是答案的关键。我想确保我没有遗漏一些关键的东西,如果采用“正式”方法,这些东西会使应用程序无法工作+1&接受。您好,我使用isLanguageAvailable进行了测试,但没有给出期望的结果。例如,没有安装韩语语音数据。然而,当我在韩国人的语音数据上调用isLanguageAvailable时,它没有下载,只是返回LANG_COUNTRY_AVAILABLE,这也是正确的。该语言环境仅适用于尚未下载的语音数据。然而,由于这一点,我永远无法检查语音数据是否已下载,因为我永远不会得到LANG_MISSING_数据。解决方案是否不再适用?谢谢此外,LANG_COUNTRY_AVAILABLE并不表示语音数据已下载,它只是表示支持并可下载。
    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)
    }