Android 文本到语音转换在倒计时中不起作用
嘿,大家好,我试着在我的一个计时器达到10秒时运行文本到语音。然而,当计时器达到10秒时,它什么也没说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
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();
}