现在,当我运行应用程序时,首先运行showLabel函数,而不是初始化TTS。我总是得到一个错误,即tts为null。有解决这个问题的更好方法吗?我应该在onInit内的showLabel上移动代码吗?它也有一个参数。目标是firstObject
将成为TTS的文本。当我尝试在Oninit内部添加.speak时,它可以工作,但在外部时,它将导致null错误。任何帮助将不胜感激!
private var tts: TextToSpeech? = null
var firstObject = ""
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_live_preview)
tts = TextToSpeech(this, this)
fun showLabel(labels: List<FirebaseVisionImageLabel>?) {
firstObject = labels!!.first().text
Log.d(TAG, firstObject)
tts!!.speak(firstObject, TextToSpeech.QUEUE_FLUSH, null, "")
}
override fun onInit(status: Int) {
if (status == TextToSpeech.SUCCESS) {
// set US English as language for tts
val result = tts!!.setLanguage(Locale.US)
if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
Log.e("TTS","The Language specified is not supported!")
} else {
Log.d("TTS", "Initilization Successful")
tts!!.speak("This is a test", TextToSpeech.QUEUE_FLUSH, null, "") // works
cameraSource?.setMachineLearningFrameProcessor(ImageLabelingProcessor())
}
} else {
Log.e("TTS", "Initilization Failed!")
}
}
答案 0 :(得分:0)
您不能在尚未初始化的TTS对象上调用talk()。
由于在showLabel()函数中有speak(),这意味着您也无法在初始化TTS之前调用showLabel()。
您可以做的是创建一个类级布尔变量 ttsIsInitialized ,并将其设置为false,直到TTS初始化为止……从onInit()内部将其设置为true。
然后,在showLabel()中,您要做的第一件事是检查布尔值是否仍然为false,然后不执行任何操作。