Android Studio,等待一行代码完成,然后再开始下一个

问题描述 投票:1回答:1

初学者问题...

我有以下4行代码。

第三行(用语音询问用户)他/她是否确定某个动作。

然后,第四行调用一个名为SpeechYesNo(包括在下面的方法)来侦听用户的响应。

问题是在txtSpeech.speak行(第3行)结束讲话之前调用了SpeechYesNo方法,它记录了“您确定...”语音行以及用户响应。

例如,如果用户回答“是”,则来自SpeechYesNo方法的结果将类似于...“确定要添加xxxxx是”。

我只希望结果为“是”。

是否有一种方法可以在调用SpeechYesNo()方法之前强制第三行(txtSpeech.speak)完成?

谢谢

String strCommonName = myUtil.getCommonName(strFinalResult);
String strToSpeak = "Are you sure you would like to add " + strCommonName;
txtSpeech.speak(strToSpeak, TextToSpeech.QUEUE_FLUSH, null);

speechYesNo();

这里是speechYesNo()方法

public void speechYesNo() {
    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());

    if(intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, 9);
    } else {
        Toast.makeText(context, "Your device does not support Speech Input.", Toast.LENGTH_LONG).show();
    }

}

这里是onActivityResult ...

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {

        case 10:

            if(resultCode == RESULT_OK && data != null) {

               ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
               String strResult = result.get(0);
               Double dblStringComparison = 0.000;
               String strFinalResult = "Unknown";

               for(int intCount = 0; intCount <= arrAnimals.size()-1; intCount++) {

                   String strVal1 = strResult;
                   String strVal2 = myUtil.getCommonName(arrAnimals.get(intCount));
                   Double dblTemp = myUtil.similarity(strVal1, strVal2 );

                   if(dblTemp > dblStringComparison){
                       dblStringComparison = dblTemp;
                       strFinalResult = arrAnimals.get(intCount);
                   }

               }


                atvAnimalName.setText(strFinalResult);

                String strCommonName = myUtil.getCommonName(strFinalResult);
                String strToSpeak = "Are you sure you would like to add " + strCommonName;
                txtSpeech.speak(strToSpeak, TextToSpeech.QUEUE_FLUSH, null);

                speechYesNo();

            }

            break;

        case 9:

            if(resultCode == RESULT_OK && data != null) {

                ArrayList<String> result2 = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                String strYesNo0 = result2.get(0);
                Toast.makeText(context, strYesNo0, Toast.LENGTH_LONG).show();

            }

            break;
    }
}

这里是完整的脚本

当用户单击图像时,将触发openSpeechMode方法,并将记录用户的语音选择。

一旦完成,我希望应用程序询问用户他/她对他/她的选择是否有把握。

如果用户回答“是”,那么我会做更多的工作。

上述问题是语音记录器正在记录“您确定”问题以及“是”响应。

public void openSpeechMode(View view) {

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());

    if(intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, 10);
    } else {
        Toast.makeText(context, "Your device does not support Speech Input.", Toast.LENGTH_LONG).show();
    }

}



public void speechYesNo() {

    Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
    intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.getDefault());

    if(intent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(intent, 9);
    } else {
        Toast.makeText(context, "Your device does not support Speech Input.", Toast.LENGTH_LONG).show();
    }

}



@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {

        case 10:

            if(resultCode == RESULT_OK && data != null) {

               ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
               String strResult = result.get(0);
               Double dblStringComparison = 0.000;
               String strFinalResult = "Unknown";

               for(int intCount = 0; intCount <= arrAnimals.size()-1; intCount++) {

                   String strVal1 = strResult;
                   String strVal2 = myUtil.getCommonName(arrAnimals.get(intCount));
                   Double dblTemp = myUtil.similarity(strVal1, strVal2 );

                   if(dblTemp > dblStringComparison){
                       dblStringComparison = dblTemp;
                       strFinalResult = arrAnimals.get(intCount);
                   }

               }


                atvAnimalName.setText(strFinalResult);

                String strCommonName = myUtil.getCommonName(strFinalResult);
                String strToSpeak = "Are you sure you would like to add " + strCommonName;
                txtSpeech.speak(strToSpeak, TextToSpeech.QUEUE_FLUSH, null);

//                    speechYesNo();

            }

            break;

        case 9:

            if(resultCode == RESULT_OK && data != null) {

                ArrayList<String> result2 = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                String strYesNo0 = result2.get(0);
                Toast.makeText(context, strYesNo0, Toast.LENGTH_LONG).show();

            }

            break;
    }

}
android android-studio speech-to-text pausing-execution
1个回答
1
投票

问题

问题是speechYesNo方法在txtSpeech.speak

解决方案

txtSpeech似乎是TextToSpeech类。因此,您应该使用UtteranceProgressListener解决您的问题。

请尝试以下代码。

txtSpeech.setOnUtteranceProgressListener(new UtteranceProgressListener() {
        @Override
        public void onStart(String utteranceId) {
        }

        @Override
        public void onDone(String utteranceId) {
            speechYesNo();
        }

        @Override
        public void onError(String utteranceId) {
        }
    });
txtSpeech.speak(strToSpeak, TextToSpeech.QUEUE_FLUSH, null);
© www.soinside.com 2019 - 2024. All rights reserved.