Создание оболочки для преобразования текста в речь в Android

Я пытаюсь создать класс-оболочку для функции преобразования текста в речь Google Android. Однако у меня возникли проблемы с поиском способа приостановить работу системы до тех пор, пока функция onInit не завершится. Внизу прикреплено что-то вроде решения, которое я создал на основе того, что нашел здесь: Речь Android — как вы можете читать текст в Android?

Однако это решение, похоже, не работает. Любые мысли о том, почему это может не работать, или что было бы хорошей идеей, чтобы убедиться, что любые вызовы Speak() происходят после моего вызова onInit()?

открытый класс 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(). Тем не менее, мне бы очень хотелось избежать необходимости уничтожать и воссоздавать весь механизм преобразования текста в речь каждый раз, когда мне нужно, чтобы моя программа говорила что-то другое.


person John Montgomery    schedule 06.04.2010    source источник


Ответы (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;
    }   
}
person gregm    schedule 15.06.2010