Android студия, дождитесь завершения одной строки кода, прежде чем начинать следующий - PullRequest
1 голос
/ 11 февраля 2020

Вопрос для начинающих ...

У меня есть следующие 4 строки кода.

Третья строка спрашивает пользователя (с речью), уверен ли он в действии.

Затем четвертая строка вызывает метод speechYesNo (включен ниже) для прослушивания ответа пользователя.

Проблема заключается в том, что метод speechYesNo вызывается перед строкой txtSpeech.speak (3-я строка) завершает разговор и записывает речевую строку «Вы уверены ...», а также ответ пользователя.

Например, если пользователь ответит «Да», результатом метода speechYesNo будет что-то как ... "Вы уверены, что хотите добавить ххххх Да".

Я просто хочу, чтобы результат был "да".

Есть ли способ заставить третью строку (txtSpeech.speak) завершить sh до вызова метода speechYesNo () ?

Спасибо

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

speechYesNo();

Вот метод речи YesNo ()

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;
    }

}

1 Ответ

1 голос
/ 11 февраля 2020

Вопрос

Проблема в том, что метод 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);
...