我正在开发一个非常简单的应用程序。这是我脑性麻痹的女儿。它只是一个很大的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();
}
}
如果我删除上面带有“注意”的区域(因为我确定已经安装了TTS),它会在我第一次运行应用程序时运行,如果我离开应用程序并再次打开它,它会显示 “说话失败了:没有绑定引擎”
这就像它不会创建TTS对象,因为应用程序仍然在内存中。
所以,伙计们......你们认为我应该做些什么?
这让我发疯,我真的需要通过平板电脑与女儿沟通!
任何帮助表示赞赏!!
答案 0 :(得分:1)
我的应用程序也遇到了这个问题:TTS适用于2.3,但是当我尝试使用4.0时,它的问题与你的问题相同(我现在在搜索解决方案时发现了这个问题)。如果您通过“设置”强制关闭应用程序并再次启动它,但只是“退出”并返回使ICS中的TTS引擎无法绑定,则引擎将起作用。
我在运行mTts.shutdown().
后尝试将TTS对象(mTts)设置为null当我在退出后再次启动应用程序时,我的mTts.speak()
行出现了空错误。
至少对于ICS来说,有些事情并没有放弃TTS引擎。 我的解决方案(现在)是我让我的TTS对象静态:
// in Activity
private static TextToSpeech mTts;
.
.
.
// in onCreate()
mTts = new TextToSpeech(this, this);
.
.
.
// in onDestroy()
if (mTts != null) {
mTts.stop();
mTts.shutdown();
mTts = null;
}
我之前只使用了一个TTS对象,所以我认为这种方法没有太多缺点。
答案 1 :(得分:0)
在我的应用程序中,我还使用checkintent.setAction(...)
来检查是否安装了必要的tts文件(在升级到ICS之前,它就像魅力一样)。在ICS中,它始终返回文件丢失。所以现在我忽略了这个检查:我正在创建对象,它初始化很好。
此外,我使用了两种不同语言的实例。这似乎也不再起作用了。
现在,当我为其中一个实例设置语言时,该对象的另一个实例被设置为相同的语言(行为类似于一个实例)。
答案 2 :(得分:0)
我通过安装ivona同时安装了Tts引擎解决了所有问题,但是我发现其他问题,例如没有默认tts安装使用这两个一起使得一个工作不是一个很好的修复,但它的修复,
此外,我找不到允许我的手机安装非市场应用程序的选项,即我的SD卡上的apk
答案 3 :(得分:0)
我有同样的问题并解决了。也许这是一个时间问题,但不确定,但是说话之前的一个简单的动作帮助了我。 无论如何,我这样做了:
mTts = new TextToSpeech(this, this);
String engine = mTts.getDefaultEngine();
mTts = new TextToSpeech(this, this,engine);
Log.d("","...something here...");
然后,当我按下发言按钮时,它说话。您应该在OnInit方法上观察变量状态。也许separate thread可以帮助在应用中进行讨论。
顺便说一句,如果您确定已安装TTS,则可以移除块Intent checkIntent = new Intent();
进行检查。
我绝对希望这可以帮助你。
答案 4 :(得分: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);
}
}
我没有使用if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {...}
,而是检查mTts
是否已经实例化。您还必须将mTts
设置为static
,正如jlquant和Rakesh在之前的帖子中所提到的那样,因此您将只有一个实例。例如,private static TextToSpeech mTts
。
所以,除非你“强制停止”应用程序或它因错误而停止工作,否则它将不再调用startActivity(installIntent);
- 每次都要求你安装TTS的烦人的罪魁祸首。
答案 5 :(得分:-1)
姜饼允许在语音输入中设置默认tts&输出/默认tts
姜饼只允许语言中的'首选'tts和语音输出的输入/文本。
所以tts是首选而不是默认值,这意味着它不清楚使用哪个。
默认情况下,应用程序覆盖了我认为更好的选项。