остановка / выключение не удалось: не привязан к движку TTS

У меня есть активность Android, которая использует TTS, но когда я выхожу из нее, в Logcat появляется ошибка подключения к службе. Над просочившейся ошибкой службы я получаю утверждение, что:

stop failed: not bound to TTS engine
shutdown failed: not bound to TTS engine

Мои onStop и onDestroy выглядят так: РЕДАКТИРОВАТЬ код:

@Override
public void onStop() {
    if (tts != null) {
    tts.stop();
    }
    super.onStop();
}

@Override
public void onDestroy() {
    if (tts != null) {
        tts.shutdown();
    }
    super.onDestroy();
}

Я запускаю TTS, когда пользователь нажимает кнопку (TTS работает нормально, я просто пытаюсь исправить ошибку подключения к службе)

if (v == speakButton && ttscrashprotect == 1) {   
    String text = inputText.getText().toString();
    if (text != null && text.length() > 0) {
        tts.speak(text, TextToSpeech.QUEUE_ADD, null);
    }

Это мой onActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == MY_DATA_CHECK_CODE) {
        if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
            //sucess with TTS create it
            tts = new TextToSpeech(this, this);
        }
        else {
            //missing TTS so install it
            Intent installIntent = new Intent();
            installIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
            startActivity(installIntent);
        }
    }

TTS работает нормально, и я вижу, что движок вызывается в logcat, но по какой-то причине tts.stop() и tts.shutdown() не привязаны к одному и тому же движку.

РЕДАКТИРОВАТЬ 2: Кажется, я подключаюсь к движку и сервису TTS более одного раза. Каждый раз, когда текст, который я хочу, чтобы TTS произносил в действии, устанавливается другое соединение с механизмом TTS и службой TTS.

Мой код TTS при изменении текста выглядит так:

if (v==nextButton && progressL1<100) {
    Video.setVisibility(View.INVISIBLE); //hide the video view

    progressL1= progressL1 + 10;
    //increase progress by 10 and then load the new files
    //load the TTS text data from Asset folder progressL1 txt file
    Advanced.this.loadDataFromAsset(progressL1);
    //try some tts stuff here
    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);

TTS запускается кодом v == speakButton выше.


person andy    schedule 21.08.2014    source источник
comment
Зачем вам вызывать tts.stop() и tts.shutdown() дважды, и в onStop(), и в onDestroy()?   -  person Alexis Pigeon    schedule 21.08.2014
comment
Я попытался добавить onStop(), так как все еще получал ошибку с .stop и .shutdown, вызываемыми из onDestroy().   -  person andy    schedule 21.08.2014


Ответы (1)


Не вызывайте tts.shutdown() дважды, достаточно будет onDestroy().

@Override
public void onStop() {
    if (tts != null) {
        tts.stop();
    }
    super.onStop();
}

@Override
public void onDestroy() {
    if (tts != null) {
        tts.shutdown();
    }
    super.onDestroy();
}
person Alexis Pigeon    schedule 21.08.2014
comment
Я внес предложенные вами изменения и обнаружил другую проблему - вопрос отредактирован. - person andy; 22.08.2014
comment
Почему бы вам просто не использовать один и тот же объект tts вместо создания нового для каждого текста, который вы хотите преобразовать в речь? - person Alexis Pigeon; 22.08.2014
comment
Совершенно верно - не знаю как. Не могли бы вы предложить в моем коде, как я могу это сделать? - person andy; 22.08.2014
comment
действительно сложно сделать правильное предложение, так как у меня нет глобального видения вашего кода и того, что вы собираетесь делать, но вы должны придерживаться только одного вызова TextToSpeech.Engine.ACTION_CHECK_TTS_DATA (например, в onCreate()), создать свой экземпляр TextToSpeech в onActivityResult() (так же, как вы делаете это сейчас), и оттуда используйте tts.speak() только тогда, когда вам нужно транскрибировать текст. - person Alexis Pigeon; 22.08.2014