Android不承认TTS引擎

Car*_*ira 9 android text-to-speech android-4.0-ice-cream-sandwich

我在这里开发一个非常简单的应用程序.这是我脑性麻痹的女儿.这只是一个很大的YES和NO按钮,所以她可以在要求时按下它们.

嗯......我正在使用SVOX经典TTS引擎.

一切顺利,直到我的平板电脑升级到ICS.现在,每次我运行应用程序时,都会打开市场,要求我安装TTS.我点击"回"然后,我的应用说话.这非常烦人.

以下是Google API所说的内容:

*成功检查将由CHECK_VOICE_DATA_PASS结果代码标记,表示在创建TextToSpeech对象后,此设备已准备好发言.如果没有,我们需要让用户知道安装设备成为多语言对话机所需的数据!下载和安装数据是通过触发ACTION_INSTALL_TTS_DATA意图完成的,该意图将用户带到Android Market,并让她/他启动下载.下载完成后,将自动安装数据.以下是onActivityResult()实现的示例:*

这是我的代码:

public class yesOunoActivity extends Activity implements OnInitListener{
ImageView yes;
ImageView no;
public TextToSpeech tts;
private int MY_DATA_CHECK_CODE = 0;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);

    tts = new TextToSpeech(this, this);

    setContentView(R.layout.yesorno);

    yes = (ImageView) findViewById(R.id.yes);
    no = (ImageView) findViewById(R.id.no);


    yes.setClickable(true); 
    yes.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent arg1) {

             if (arg1.getAction() == android.view.MotionEvent.ACTION_DOWN) {                             
                 tts.speak("yes!", TextToSpeech.QUEUE_ADD, null);
             }
             return true;
        }
    });


    no.setClickable(true); 
    no.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent arg1) {

             if (arg1.getAction() == android.view.MotionEvent.ACTION_DOWN) {                             

                //Intent myIntent = new Intent(v.getContext(), ParametrosActivity.class);
                tts.speak("no!", TextToSpeech.QUEUE_ADD, null);
             }
            return true;
    }

    });


}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            // success, create the TTS instance
            tts = new TextToSpeech(this, this);
        } else {
            // missing data, install it
            //ATTENTION: BELOW THIS GIVES ME PROBLEMS SINCE IT OPENS MARKET
            //AND I HAVE TO HIT THE BACK BUTTON, THEN, IT SPEAKS!
            //BTW TTS ENGINE "IS" INSTALLED!!
            Intent installIntent = new Intent();
            installIntent
                    .setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }

}

@Override
public void onInit(int status) {
    if (status == TextToSpeech.SUCCESS) {
    } else if (status == TextToSpeech.ERROR) {
    }
}

@Override
public void onDestroy() {
    if (tts != null) {
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
    System.gc();
}

    }
Run Code Online (Sandbox Code Playgroud)

如果我删除上面带有"注意"的区域(因为我确定我安装了TTS),它在我第一次运行应用程序时工作,如果我离开应用程序并再次打开它,它说"说话失败:没有约束到引擎"

这就像它不会创建TTS对象,因为应用程序仍然在内存中.

所以,伙计们......你们认为我应该做些什么?

这让我发疯,我真的需要通过平板电脑与女儿沟通!

任何帮助表示赞赏!!

mas*_*hay 0

这就是我所拥有的onActivityResult(...)

@Override
protected void onActivityResult(
        int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
/*
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            // success, create the TTS instance
            mTts = new TextToSpeech(this, this);
        } else {
            // missing data, install it
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
*/
        if (mTts==null) {
            Intent installIntent = new Intent();
            installIntent.setAction(
                TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);                           
        }
        mTts = new TextToSpeech(this, this);                
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有使用if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {...},而是检查是否mTts已经实例化。您还必须设置mTtsas static,正如 jlquant 和 Rakesh 在之前的文章中提到的那样,因此您将只有它的一个实例。例如,private static TextToSpeech mTts

因此,除非您“强制停止”应用程序或者它因错误而停止工作,否则它不会再调用startActivity(installIntent);- 每次都要求您安装 TTS 的烦人罪魁祸首。