1

我正在尝试为 Google Android 的 Text-To-Speech 功能创建一个包装类。但是,我很难找到一种方法让系统暂停,直到 onInit 函数完成。附在底部的是我根据我在这里找到的内容创建的解决方案:Android 语音 - 你如何在 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() 函数中播放。但是,我真的很想避免每次我需要让我的程序说出不同的内容时都必须破坏和重新创建整个文本到语音引擎。

4

1 回答 1

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;
    }   
}
于 2010-06-15T17:39:19.937 回答