2

我正在开发一个简单的应用程序,它会在接到电话时说出联系人姓名或未知号码。我正在使用broadcastReceiverand实现应用程序Services。如果我运行该应用程序emulator并使用 开始通话DDMS,并保存 2 或 3 个联系人,则该应用程序运行良好,因为在运行onInit()之前被调用tts.speak()

现在,当我尝试在我的 android 手机上运行相同的应用程序时,onInittts.speak(). 根据我在寻找这个问题的答案时的理解,这是由于tts.speak()没有等待onInit被调用而发生的。

我在这个问题上找到的一个解决方案是关于如何在 Android 上等待 TextToSpeech 初始化,但这也不起作用。

这个问题被问了很多次,但我找不到有效的解决方案。此链接建议使用处理程序http://davidcheney.wordpress.com/2010/11/16/multitasking-in-android/但作为新手我不知道如何实现它。

据我了解,我必须等到onInit被调用才能使用tts.speak(),但我不知道该怎么做。

更新 我试图在speak外部调用函数,onInit因为要说的数据来自其他地方,我不想在其中进行所有编码onInit,这不起作用。所以我改变了我的代码,最后以某种方式设法在speak()里面运行它onInit()。虽然现在代码是在运行但是一定有办法在speak()外面调用onInit。因此,我将等待更好的答案,否则将我的代码发布给面临同样问题的其他人。

4

2 回答 2

2

You either set a class member flag boolean mTtsInitialized and check this flag everytime you call speak or put the code to get the data to be spoken in onInit

于 2013-07-16T17:44:36.713 回答
1

这不是最优雅的处理方式,我敢肯定,但你能扩展包含 onInit() 方法的类吗?

在这个类中,你可以有一个布尔变量来有效地“锁定”你的线程。重写 onInit() 方法,调用 super(),然后在 super() 之后将此值设置为 true。然后,进入一个循环,阻塞调用 tts.speak() 的线程,直到该值为真。

您需要记住,您不能在 UI 线程中执行此操作,因为如果您阻止它太久,它会导致您的应用程序崩溃。

我希望我正确理解了你的问题。:)

于 2013-07-16T15:05:51.247 回答