Android 连续调用TextToSpeech.OnInitListener.onInit(int)

Android 连续调用TextToSpeech.OnInitListener.onInit(int),android,text-to-speech,Android,Text To Speech,我收到报告说,在一些(并非所有)HTC Desire HD(FRF91,2.2)和HTC EVO 4G(PC36100 | 3.29.651.5,2.2)上,在同一个对象上重复调用TextToSpeech.OnInitListener.onInit(int)。我的任何其他用户(或其他Desired HD用户)AFAICT都不会出现这种行为 代码是: TextToSpeech tts = new TextToSpeech(context, new TextToSpeech.OnInitListen

我收到报告说,在一些(并非所有)HTC Desire HD(FRF91,2.2)和HTC EVO 4G(PC36100 | 3.29.651.5,2.2)上,在同一个对象上重复调用
TextToSpeech.OnInitListener.onInit(int)
。我的任何其他用户(或其他Desired 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++;
    }
});
有人有什么想法吗


编辑:我还尝试调用
shutdown()
方法(第一次检测到多个侦听器调用),但这似乎没有帮助。

也许您应该使用自己的中间方法来解决这个问题,例如:

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

这可能有帮助,也可能没有帮助,但我在从服务调用tts时遇到了类似的问题,幸运的是,我最好通过解决问题的活动进行tts

如果您这样做并且是适当的,请确保您的活动清单具有:

android:finishOnTaskLaunch="true" 

在创建ie之前尝试创建Textospeech对象。全局。尝试此代码并检查它是否仍多次调用

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

}

请详细说明!!什么是地位??何时更新?状态为成功(AFAICT)。这大概是我从Flurry报告中所能理解的。每1000个用户中只有1个会发生这种情况,但对于那些确实发生这种情况的用户来说,这种情况总是会发生。启用TTS服务的代码在哪里?您在
onInit()
中还做了什么?可能有什么东西正在重新触发。另外,如果没有安装TTS资源,您是否测试了所有内容?您的千分之一用户可能是未加载的用户。TTS服务仍将初始化(您仍可以播放耳机,但不能播放语音)。在emulator上为我复制。Android 2.2,安装了SVOX Classic TTS引擎,通过TTS扩展服务工作。我在onInit中什么都不做。您在活动生命周期的哪一部分启动TTS?请检查是否正在生成导致您重新初始化TTS的活动生命周期事件。我们在一个应用程序中广泛使用TTS,从未见过这种行为。确保您在没有安装TTS资源的情况下尝试;在这种情况下,它会触发一个活动,询问用户是否安装TTS。