Android不确认TTS引擎

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

那么…我正在使用SVOX经典TTS引擎。

一切正常运行,直到我的平板升级到ICS。 现在,每次我运行应用程序,它打开市场要求我安装TTS。 我打“回”,然后,我的应用程序说话。 这是非常烦人的。

以下是Google API所说的内容:

*成功的检查将通过CHECK_VOICE_DATA_PASS结果代码进行标记,表示在创buildTextToSpeech对象后,此设备已准备好发言。 如果没有,我们需要让用户知道安装设备所需的数据成为一个多语言的通话机! 下载和安装数据是通过触发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引擎“

这就像它不创buildTTS对象,因为应用程序仍然在内存中。

所以,大家…你们认为我应该怎么做?

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

任何帮助表示赞赏!

Solutions Collecting From Web of "Android不确认TTS引擎"

这是我在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的烦人的罪魁祸首。

我的应用程序也遇到了这个问题:TTS在2.3版本中工作,但当我尝试4.0时,它与您的问题(我刚刚在search解决scheme时发现的)有相同的症状。 如果您通过设置强制closures应用程序并重新启动它,但只是“退出”并返回使ICS中的TTS引擎无法绑定,引擎将工作。

我试着在运行mTts.shutdown().之后将TTS对象(mTts)设置为null mTts.shutdown(). 当我退出后再次启动应用程序时,我的mTts.speak()行出现空错误。

至less对于ICS来说,TTS引擎是不能放弃的。 我的解决scheme (现在)是我已经使我的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对象,所以我不认为这种方法有太多的缺点。

我通过安装ivona来解决这个问题,两个Tts引擎都解决了所有的问题,但是我发现其他的问题,比如没有使用默认的tts安装,使得一个工作不是一个很好的解决scheme,但是它的修复,

此外,我无法find允许我的手机安装非市场应用程序的选项,即从我的SD卡apk

我有同样的问题,解决了。 也许这是一个时间问题的边界,不知道,但一个简单的行动之前说话帮助我。 无论如何,我这样做:

mTts = new TextToSpeech(this, this);

String engine = mTts.getDefaultEngine();

mTts = new TextToSpeech(this, this,engine);

Log.d("","...something here...");

然后,当我打我的发言button,它说话。 你应该在OnInit方法上观察你的variables状态。 也许一个单独的线程可以帮助在应用程序中谈话。

顺便说一句,如果你确定安装了TTS,你可以删除块Intent checkIntent = new Intent(); 检查。

我绝对希望这可以帮助你。

在我的应用程序中,我还使用checkintent.setAction(...)来检查是否安装了必要的tts文件(在升级到ICS之前,它的function就像一个魅力一样)。 在ICS中,它总是返回文件丢失。 所以现在我只是忽略这个检查:我创build的对象,它初始化罚款。 此外,我使用两个不同的语言的两个实例。 这似乎也不行了。 现在,当我为其中一个实例设置语言时,对象的另一个实例被设置为相同的语言(就像一个实例一样)。

姜饼允许在声音input和输出/默认tts中设置默认的tts

姜饼只允许语言和input/文本到语音输出的“首选”。

所以tts是首选的,而不是默认的,这就意味着它不那么清晰。

应用程序覆盖默认情况下,我认为是一个更好的select。