спирането/изключването е неуспешно: не е свързано с 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() не са обвързани с един и същи двигател.

EDIT2: Изглежда, че се свързвам с 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(), когато трябва да изпратите TTS някакъв текст. - person Alexis Pigeon; 22.08.2014