Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在onInit外部自动运行文本到语音_Android_Kotlin_Text To Speech - Fatal编程技术网

Android 在onInit外部自动运行文本到语音

Android 在onInit外部自动运行文本到语音,android,kotlin,text-to-speech,Android,Kotlin,Text To Speech,所以现在,当我运行应用程序时,函数showLabel首先运行,而不是初始化TTS。我总是得到一个tts为空的错误。有没有更好的方法来解决这个问题?我应该将showLabel上的代码移动到onInit中吗?它也有一个参数。目标是firstObject将成为TTS的文本。当我尝试在内部添加.speak时,它会工作,但在外部时,它会导致空错误。任何帮助都将是感激的 private var tts: TextToSpeech? = null var firstObject = "" override

所以现在,当我运行应用程序时,函数showLabel首先运行,而不是初始化TTS。我总是得到一个tts为空的错误。有没有更好的方法来解决这个问题?我应该将showLabel上的代码移动到onInit中吗?它也有一个参数。目标是
firstObject
将成为TTS的文本。当我尝试在内部添加.speak时,它会工作,但在外部时,它会导致空错误。任何帮助都将是感激的

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!")
        }

    }
private-var-tts:TextToSpeech?=无效的
var firstObject=“”
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity\u live\u预览)
tts=TextToSpeech(这个,这个)
趣味showLabel(标签:列表?){
firstObject=标签!!.first().text
Log.d(标记,第一个对象)
tts!!.speak(第一个对象,TextToSpeech.QUEUE\u FLUSH,null,“”)
}
覆盖乐趣onInit(状态:Int){
if(status==TextToSpeech.SUCCESS){
//将美国英语设置为tts的语言
val result=tts!!.setLanguage(Locale.US)
if(result==TextToSpeech.LANG_缺少数据| | result==TextToSpeech.LANG_不受支持){
Log.e(“TTS”,“不支持指定的语言!”)
}否则{
Log.d(“TTS”,“初始化成功”)
tts!!.speak(“这是一个测试”,TextToSpeech.QUEUE\u FLUSH,null,”),可以正常工作
cameraSource?.setMachineLearningFrameProcessor(ImageLabelingProcessor())
}
}否则{
Log.e(“TTS”,“初始化失败!”)
}
}
您不能对尚未初始化的TTS对象调用speak()

由于showLabel()函数中有speak(),这意味着在TTS初始化之前也不能调用showLabel()

您可以做的是创建一个类级布尔变量ttsIsInitialized,并将其设置为false,直到TTS初始化为止……从onInit()内部将其设置为true


然后,在showLabel()中,您要做的第一件事是检查布尔值an是否仍然为false,然后返回/不执行任何操作。

顺便说一句,这段代码没有编译。看起来您缺少onCreate的右括号?@BooberBunz抱歉,这只是我代码的一个片段,但我可以显示完整的代码