2010-04-06 49 views
1

我正在尝试为Google Android的文本转语音功能创建包装类。但是,我很难找到一种方法让系统暂停,直到onInit函数完成。底部附带的是我根据我在此处找到的内容创建的解决方案:Android speech - how can you read text in 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发挥()函数。但是,我真的很想避免每次需要让我的程序说出不同的内容时,必须销毁并重新创建整个文本到语音引擎。

回答

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; 
    } 
}