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

时间:2011-01-27 16:55:40

标签: android text-to-speech

据我所知,在某些(并非所有)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++;
    }
});

任何想法?

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

3 个答案:

答案 0 :(得分: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'
    }
}

答案 1 :(得分:1)

这可能会有所帮助,也可能没有帮助,但是当我从服务中拨打电话时遇到了类似的问题,幸运的是,我最好通过一项解决问题的活动来完成我的工作。

如果您这样做并且合适,请确保您的活动清单包含:

android:finishOnTaskLaunch="true" 

答案 2 :(得分:0)

尝试在创建之前创建Textospeech的对象ie。全局.try这个代码并检查它是否仍然多次调用????

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

}