onInit никогда не происходит на Android 4.4.2, когда я создаю новый экземпляр TextToSpeech
Я попробовал тот же код на 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);
}
}
3 ответа
Проблема решена: я не знаю почему, но, исключив вызов метода, который инициировал AsyncTask, все получилось. Метод был вызван в onCreateView и не имел никакого отношения к TTS, так как был необходим для получения дейтаграмм UDP.
Кажется, что есть некоторая проблема, связанная с обработкой AsyncTask, когда вы инициализируете движок TTS в Android 4.4.2.
Если кто-то еще сталкивается с этой проблемой, я предлагаю подождать, пока метод onInit не будет вызван каким-либо циклом, который проверяет это условие, а затем продолжить запуск процессов AsyncTask (даже если они не связаны с TTS). Это сработало для меня по крайней мере...
Как обходной путь, вы можете запустить задачу таймера, чтобы отложить запуск вашей асинхронной задачи до тех пор, пока текст в речь не будет инициализирован. Задача таймера должна запустить исполняемый файл, который запускает асинхронную задачу из потока пользовательского интерфейса. В моем случае задержка в одну секунду была хорошей.