我在开发一个非常简单的应用程序,为我患有脑瘫的女儿设计。它只有一个大的“是”和“否”的按钮,所以她可以在被要求时按下它们。
好吧……我正在使用SVOX Classic TTS引擎。
一切都很顺利,直到我的平板电脑升级到ICS为止。现在,每次我运行这个应用程序时,它都会打开市场,并要求我安装TTS。我点击“返回”,然后我的应用程序会说话。这真的非常让人恼火。
以下是Google API的说明:
*如果我们的TextToSpeech对象创建后,成功的检查将标记为CHECK_VOICE_DATA_PASS结果代码,表示此设备已准备好进行语音输出。否则,我们需要告诉用户安装所需的数据,使设备成为一个多语言的语音输出机器!通过触发ACTION_INSTALL_TTS_DATA意图来下载和安装数据,该意图将带领用户进入Android市场并允许他/她启动下载。下载完成后,将自动安装数据。以下是您的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();
}
}
如果我删除上面带有“ATTENTION”的部分(因为我确定已经安装了TTS),它在第一次运行应用程序时可以工作,但如果我离开应用程序然后再次打开它,它会显示“speak failed: not bound to tts engine”。就像它没有创建TTS对象一样,因为应用程序仍然在内存中。
那么,大家...你们认为我应该怎么做呢?
这让我疯狂,我真的需要通过平板电脑与我的女儿进行沟通!
感谢任何帮助!