Подтвердить что ты не робот

TextToSpeech.OnInitListener.onInit(int), вызываемый непрерывно

Я получаю сообщения о том, что некоторые (не все) HTC Desire HD (FRF91, 2.2) и HTC EVO 4G (PC36100 | 3.29.651.5, 2.2), TextToSpeech.OnInitListener.onInit(int) вызывается повторно (более 1500 раз в течение нескольких секунд) на том же объекте. Такое поведение не возникает ни для одного из моих других пользователей (или других пользователей Desire HD) AFAICT.

Код:

TextToSpeech tts = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
    private int mCallCount = 0; // trying to investigate potential infinite loops

    @Override
    public void onInit(int status) {
        if ((mCallCount % 100) == 1) {
            // report this
        }
        mCallCount++;
    }
});

Любые идеи?

EDIT: Я также пробовал вызывать метод shutdown() (впервые обнаружены вызовы нескольких прослушивателей), но это, похоже, не помогает.

4b9b3361

Ответ 1

Возможно, вам стоит обойти это с помощью собственного метода посредника, например:

private long lastCall = 0;
private long deepBreath = 5*1000; //5 seconds
private boolean hasRested;

TextToSpeech tts = new TextToSpeech(context, new TextToSpeech.OnInitListener() { 
    @Override 
    public void onInit(int status) { 
        long thisCall = Calendar.getInstance().getTimeInMillis();
        intermediaryMethod(status, thisCall);
    } 
}); 

//new method
public void intermediaryMethod(int status, long thisCall) {
    hasRested = (thisCall-lastCall)>=deepBreath;
    if (hasRested) {
        lastCall = thisCall;
        //do something about 'status'
    }
}

Ответ 2

Это может или не поможет, но у меня была аналогичная проблема при вызове tts из службы, к счастью для меня, мне было лучше делать мои tts из активности, которая решила проблему.

Если вы сделаете это, и это уместно, убедитесь, что ваш манифест для активности имеет:

android:finishOnTaskLaunch="true" 

Ответ 3

Попробуйте создать объект Textospeech раньше, чтобы создать ie. глобально. Попробуйте этот код и проверьте, все ли он вызывает много раз????

public class TtsActivity extends Activity implements OnInitListener {

private int MY_DATA_CHECK_CODE = 0;

private TextToSpeech tts;

private EditText inputText;
private Button speakButton;

@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    inputText = (EditText) findViewById(R.id.input_text);
    speakButton = (Button) findViewById(R.id.speak_button);

    speakButton.setOnClickListener(new OnClickListener() {          
        @Override
        public void onClick(View v) {
            String text = inputText.getText().toString();
            if (text!=null && text.length()>0) {
                Toast.makeText(TtsActivity.this, "Saying: " + text, Toast.LENGTH_LONG).show();
                tts.speak(text, TextToSpeech.QUEUE_ADD, null);
            }
        }
    });

    Intent checkIntent = new Intent();
    checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
    startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);

}

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

}

@Override
public void onInit(int status) {        
    if (status == TextToSpeech.SUCCESS) {
        Toast.makeText(TtsActivity.this, 
                "Text-To-Speech engine is initialized", Toast.LENGTH_LONG).show();
    }
    else if (status == TextToSpeech.ERROR) {
        Toast.makeText(TtsActivity.this, 
                "Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show();
    }
}

}