4

AndroidでのText-To-Speechの公式紹介では、「アクティビティを作成したら、最初のステップとして、対応する目的でTTSリソースの存在を確認することをお勧めします」と述べています。

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

しかし、このスレッドの@gregmは、そうでないことを示唆しています。

また、ACTION_CHECK_TTS_DATAインテントを使用しないでください。使用するのは面倒です

代わりに、次のようにします。

  1. TextToSpeechを作成する
  2. OnInitで、isLanguageAvailable()をチェックします。そうである場合は、アプリがすべて設定されています。そうでない場合は、ACTION_INSTALL_TTS_DATAを送信します

私が正しく理解していれば、@ gregmが行う/提案するのは、チェックをからに延期することですTextToSpeech.LANG_MISSING_DATAonActivityResult()onInit()

なぜこれが正式なアプローチよりも優れているのですか?

そして、なぜACTION_CHECK_TTS_DATAは「使いにくい」のでしょうか?

4

1 に答える 1

8

@gregm です。

ACTION_CHECK_TTS_DATATextToSpeech.isLanguageAvailable()より複雑な実行とより多くのコードが必要ですが、 Let me Explainと同じことを行います。

1) を使用する場合、2 つの非同期プロセスが必要ですACTION_INSTALL_TTS_DATA。まず、 を起動しIntentて結果を受け取ります。2 つ目は、TextToSpeech呼び出しを待機するonInit()ことです。アプリがすべての待機を行っている間に、More がうまくいかない可能性があります。

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 の公式ドキュメントを変更する必要があると思います。

私たちが議論している両方のアプローチがまったく同じことを行うとまだ信じていない場合は、私が持っている代替実装をチェックしてくださいここここ. また、これらすべてを気にせず、アプリに話すだけさせたい場合は、このアクティビティを拡張するだけで完了です。

于 2012-07-19T15:43:47.257 に答える