我正在尝试为Google Android的文字转语音功能创建一个包装类。但是,在onInit函数完成之前,我无法找到让系统暂停的方法。附在底部的是我根据我在此处找到的内容创建的解决方案:Android speech - how can you read text in Android?
但是,此解决方案似乎不起作用。有关为什么这可能不起作用的任何想法,或者为了确保在我的onInit()调用之后发生任何Speak()调用会有什么好主意?
公共类SpeechSynth实现OnInitListener {
private TextToSpeech tts;
static final int TTS_CHECK_CODE = 0;
private int ready = 0;
private ReentrantLock waitForInitLock = new ReentrantLock();
SpeechSynth( Activity screen )
{
ready = 0;
tts = new TextToSpeech( screen, this );
waitForInitLock.lock();
}
public void onInit(int status)
{
if (status == TextToSpeech.SUCCESS)
{
ready = 1;
}
waitForInitLock.unlock();
}
public int Speak( String text )
{
if( ready == 1 )
{
tts.speak(text, TextToSpeech.QUEUE_ADD, null);
return 1;
}
else
{
return 0;
}
}
}
我能够做到这一点,以便我可以通过构造函数传递一串文本,然后让它在onInit()函数中播放。但是,每当我需要让我的程序说出不同的内容时,我真的希望避免破坏和重新创建整个文本到语音引擎。
答案 0 :(得分:1)
我建议您依靠锁而不是就绪状态int。插入代码如下:
public int Speak( String text )
{
if (waitForInitLock.isLocked())
{
try
{
waitForInitLock.tryLock(180, TimeUnit.SECONDS);
}
catch (InterruptedException e)
{
Log.e(D_LOG, "interruped");
}
//unlock it here so that it is never locked again
waitForInitLock.unlock();
}
if( ready == 1 )
{
tts.speak(text, TextToSpeech.QUEUE_ADD, null);
return 1;
}
else
{
return 0;
}
}