Android 文本到语音转换在倒计时中不起作用

Android 文本到语音转换在倒计时中不起作用,android,eclipse,text-to-speech,Android,Eclipse,Text To Speech,嘿,大家好,我试着在我的一个计时器达到10秒时运行文本到语音。然而,当计时器达到10秒时,它什么也没说 package com.android.countdown; import java.util.Locale; import android.app.Activity; import android.os.Bundle; import android.os.CountDownTimer; import android.view.View; import android.speech.tts

嘿,大家好,我试着在我的一个计时器达到10秒时运行文本到语音。然而,当计时器达到10秒时,它什么也没说

package com.android.countdown;


import java.util.Locale;
import android.app.Activity;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.View;
import android.speech.tts.TextToSpeech;
import android.widget.Button;
import android.widget.TextView;
import android.view.View.OnClickListener;

public class countdown extends Activity implements TextToSpeech.OnInitListener{
    CountDownTimer Counter1;
    CountDownTimer Counter2;
    CountDownTimer Counter3;
    int Interval = 1;
    TextToSpeech tts;

    public String formatTime(long millis) {
          String output = "0:00";
          long seconds = millis / 1000;
          long minutes = seconds / 60;

          seconds = seconds % 60;
          minutes = minutes % 60;


          String secondsD = String.valueOf(seconds);
          String minutesD = String.valueOf(minutes);

          if (seconds < 10)
            secondsD = "0" + seconds;
          if (minutes < 10)
            minutesD = "0" + minutes;

          output = minutesD + " : " + secondsD;
          return output;
        }

      @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);




//Declare Start/Stop timer
    Button btnstart = (Button)findViewById(R.id.btnstart);
    Button btnstop = (Button)findViewById(R.id.btnstop);

//Text field to show time left
    final TextView mCounter1TextField=(TextView)findViewById(R.id.counter1);
    final TextView mCounter2TextField = (TextView)findViewById(R.id.counter2);
    final TextView mCounter3TextField=(TextView)findViewById(R.id.counter3);


//Counter 1
Counter1 = new CountDownTimer(20000 , Interval) {

public void onTick(long millisUntilFinished){
    mCounter1TextField.setText("Seconds remaining: " + formatTime(millisUntilFinished));
    if (millisUntilFinished == 10000) {
        countdown1speech();
    }


}

public void onFinish() {
    Counter1.start();  
}
};



}

      public void countdown1speech() {
            tts = new TextToSpeech(this, this);
            tts.setLanguage(Locale.US);
            tts.speak("You have 10 seconds remaining", TextToSpeech.QUEUE_ADD, null);

        }

    @Override
    public void onInit(int status) {

    }

    @Override
    public void onDestroy() {
        // Don't forget to shutdown!
        if (tts != null) {
            tts.stop();
            tts.shutdown();
        }

        super.onDestroy();
    }


}

在那里没有得到一个错误。但我不确定为什么演讲不起作用。

您需要在活动中初始化TTS
onCreate()
onResume()
方法。另请看

嗯,我看不出你的计时器一开始是如何启动的。直到你完成了才开始!你有:

public void onFinish() {
    Counter1.start();  
}
.start()函数;应该在倒数计时器实例化的右括号之后


如果您能正确格式化代码并去掉按钮等多余的东西,这将非常有帮助。

谢谢!我已经在onCreate()中初始化了它。但是我有一个小问题。。如果我离开,如果(millisuntiltfinished==10000),那么演讲就不会出现。但是如果我把它改为if(millisuntiltfinished<10000),语音会出现,但当计时器低于10秒时,它(显然)会继续重复。你知道为什么它不能准确地检测到10秒的间隔吗?有办法解决这个问题吗?起初我以为是间隔被设置为1,所以我把它改为1000,但仍然不起作用。我的猜测是,计时器不是以毫秒分辨率(可能取决于硬件)调用的,因此可以在例如10004时调用onTick(),然后在分辨率为例如10ms时调用9994。非常感谢。我决定添加if(millisuntiltiffinished<10999){if(millisuntiltiffinished>9999){,直到我能找到另一种解决方法。我在那里设置了这个选项,这样计时器会在达到0时重置并再次启动。这是一种特殊的计时器;)我也没有包含全部代码。当按下按钮时计时器启动。
public void onFinish() {
    Counter1.start();  
}