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). Это сработало для меня по крайней мере...

Как обходной путь, вы можете запустить задачу таймера, чтобы отложить запуск вашей асинхронной задачи до тех пор, пока текст в речь не будет инициализирован. Задача таймера должна запустить исполняемый файл, который запускает асинхронную задачу из потока пользовательского интерфейса. В моем случае задержка в одну секунду была хорошей.