Android TextToSpeech не работает, если вызывается напрямую из onCreate - PullRequest
0 голосов
/ 28 апреля 2018

Это тестовое действие, когда кнопка нажата, textToSpeech работает просто отлично, но не будет работать, когда вызывается функция playString (), вызывается playString () из onCreate () этого TestActivity.

public class TestActivity  extends Activity {
    TextToSpeech textToSpeech;
    EditText editText;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        editText=(EditText)findViewById(R.id.editText);
        button=(Button)findViewById(R.id.button);

        textToSpeech=new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
            @Override
            public void onInit(int status) {
                if(status != TextToSpeech.ERROR) {
                    textToSpeech.setLanguage(Locale.UK);
                }
            }
        });

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String sentence = "Testing String";
                textToSpeech.speak(sentence, TextToSpeech.QUEUE_FLUSH, null);
            }
        });
        playString();
    }

    public void playString(){
        String sentence = "Testing String";
        textToSpeech.speak(sentence, TextToSpeech.QUEUE_FLUSH, null);
    }

    public void onPause(){
        if(textToSpeech !=null){
            textToSpeech.stop();
            textToSpeech.shutdown();
        }
        super.onPause();
    }
}

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

Из документации :

Экземпляр TextToSpeech может использоваться для синтеза текста только после того, как он завершил свою инициализацию .

Инициализация может занять много времени (на моем устройстве это займет ~ 30 секунд), поэтому вы не можете использовать обработчик с некоторой случайной задержкой.
Вместо этого вы можете поместить playString() в блок onInit сразу после textToSpeech.setLanguage(Locale.UK);, поэтому строка будет воспроизводиться, когда ее можно будет воспроизвести.

0 голосов
/ 28 апреля 2018

Пожалуйста, используйте код ниже в методе oncreate для вызова texttospeech:

 textToSpeech = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
        @Override
        public void onInit(int status) {
            if (status != TextToSpeech.ERROR) {
                textToSpeech.setLanguage(Locale.UK);
            }
        }
    });


    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            //Do something after 100ms

            String sentence = "Testing String";
            textToSpeech.speak(sentence, TextToSpeech.QUEUE_FLUSH, null);
        }
    }, 500);
...