2011-01-27 10 views
25

私は、一部の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.OnInitListener.onInit(int)が連続して呼び出されています

コードは次のとおりです。

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()メソッドを呼び出すことも試みましたが(最初に複数のリスナー呼び出しが検出されたとき)、これは役に立たないようです。

+0

ご丁寧にお願い致します!ステータスは何ですか?いつ更新されていますか? – garima

+0

ステータスはSUCCESS(AFAICT)です。それはFlurryレポートから解読できる程度です。 1000人のユーザーのうち約1人にしか発生しませんが、起こったユーザーにとっては一貫して発生します。 –

+0

TTSサービスを有効にするコードはどこですか? 'onInit()'の中で何をしていますか? 何かが再びトリガーする可能性があります。 また、TTSリソースがインストールされていない場合は、すべてをテストしましたか? 1,000人に1人のユーザーが、読み込まれていないユーザーかもしれません。 TTSサービスはまだ初期化されます(イヤコンは再生できますが、音声は再生できません)。 –

答えて

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

これは、またはかもしれ助けないかもしれませんが、サービスからのときのコールTTS私は、私は幸いにも私のために、同様の問題がありました問題を解決した活動から私のttsをやるほうがずっと良かったです。

android:finishOnTaskLaunch="true" 
0

は、すなわちを作成する前に、上の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(); 
    } 
} 

} 
関連する問題