我在Android 2.3
上尝试了相同的代码。它完美无缺。我记得我已经和Android 4.0
一起使用了。
现在,在 Nexus 4 和 Nexus 7 上使用Android 4.4.2
onInit方法尝试应用程序不会被调用。有人告诉我会知道原因,或建议其他实施方法吗?
public class MyFragment extends Fragment implements TextToSpeech.OnInitListener{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_recognition, container, false);
return v;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
// check for TTS data
Intent checkTTSIntent = new Intent();
checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE);
}
@Override
public void onDetach() {
super.onDetach();
if(myTTS != null) {
myTTS.stop();
myTTS.shutdown();
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// the user has the necessary data - create the TTS
myTTS = new TextToSpeech(getActivity(), this);
} else {
//no data - install it now
Intent installTTSIntent = new Intent();
installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installTTSIntent);
}
}
}
// setup TTS
public void onInit(int initStatus) {
// check for successful instantiation
// if (initStatus == TextToSpeech.SUCCESS) {
// if(myTTS.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE)
myTTS.setLanguage(Locale.ITALIAN);
// }
// else if (initStatus == TextToSpeech.ERROR) {
// Toast.makeText(this, "Sorry! Text To Speech failed...",
// Toast.LENGTH_LONG).show();
// }
speak("Sintesi Vocale Attiva");
}
private void speak(String speech) {
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "true");
myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, hashMap);
}
}
答案 0 :(得分:4)
在Android 4.4.2中初始化TTS引擎时,似乎存在与AsyncTask处理相关的一些问题。
如果其他人遇到这个问题,我建议等到调用onInit方法时使用一些循环来检查这个条件,然后继续启动AsyncTask进程(即使它们与TTS无关) 。这至少对我有用......
答案 1 :(得分:3)
解决问题: 我不知道为什么,但是取消对启动AsyncTask的方法的调用,一切都解决了。该方法在onCreateView中调用,与接收UDP数据报所需的TTS无关。
答案 2 :(得分:-1)
作为工作环节,您可以启动计时器任务以延迟异步任务的启动,直到初始化文本到语音。计时器任务应该启动一个runnable,它可以从UI线程启动Async Task。在我的情况下,延迟一秒钟就可以了。