2012-07-18 33 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