当我创建新的TextToSpeech实例时,onInit从未在Android 4.4.2上发生过

时间:2014-01-20 12:59:40

标签: android android-fragments text-to-speech android-4.4-kitkat google-text-to-speech

我在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 个答案:

答案 0 :(得分:4)

在Android 4.4.2中初始化TTS引擎时,似乎存在与AsyncTask处理相关的一些问题。

如果其他人遇到这个问题,我建议等到调用onInit方法时使用一些循环来检查这个条件,然后继续启动AsyncTask进程(即使它们与TTS无关) 。这至少对我有用......

答案 1 :(得分:3)

解决问题: 我不知道为什么,但是取消对启动AsyncTask的方法的调用,一切都解决了。该方法在onCreateView中调用,与接收UDP数据报所需的TTS无关。

答案 2 :(得分:-1)

作为工作环节,您可以启动计时器任务以延迟异步任务的启动,直到初始化文本到语音。计时器任务应该启动一个runnable,它可以从UI线程启动Async Task。在我的情况下,延迟一秒钟就可以了。