2011-01-27 25 views
25

Bazı (hepsi değil) HTC Desire HD (FRF91, 2.2) ve HTC EVO 4G (PC36100 | 3.29.651.5, 2.2) sürümlerinde raporlar alıyorum. Aynı nesne üzerinde TextToSpeech.OnInitListener.onInit(int) tekrar tekrar (birkaç saniye içinde 1500'den fazla kez) çağrılıyor. Bu davranış benim diğer kullanıcılardan herhangi biri (veya diğer Desire HD kullanıcıları ile) için AFAICT oluşmaz.TextToSpeech.OnInitListener.onInit (int) sürekli olarak adlandırılıyor

kodudur:

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

Herkes herhangi bir fikir?

DÜZENLEME: Ayrıca, shutdown() yöntemini (birden çok dinleyici çağrısının ilk kez algılanması) çağırmayı denedim ancak bu yardımcı olmadı.

+0

ayrıntılı lütfen! durum nedir? ne zaman güncelleniyor? – garima

+0

Durum, SUCCESS (AFAICT). Flurry raporlarından deşifre edebileceğim kadar. Sadece 1000 kullanıcı için yaklaşık 1 olur, ancak bu kullanıcılar için, sürekli olarak gerçekleşir. –

+0

TTS hizmetini etkinleştiren kod nerede? Dışarıda bıraktığınız onInit() 'in içinde başka neler yapıyorsunuz? Bir şeyin yeniden tetiklenmesi mümkündür. Ayrıca, TTS kaynakları yüklü değilse, her şeyi test ettiniz mi? 1-in-1000 kullanıcılarınız yüklü olmayanlar olabilir. TTS hizmeti yine de başlatılacak (hala kulak küpleri çalabilir, konuşma yapamazsınız). –

cevap

1

Belki örneğin, kendi aracı yöntemi ile etrafında almalısınız: Bu veya yardımcı olmayabilir

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

ama benzer bir sorun vardı çağrı tts bana ben neyse ki bir hizmetten Sorunumu çözen bir aktiviteden tt yapmaktan daha iyiydi. Bunu ve bu uygun değilse

, etkinlikler açısından tezahür sahip olduğundan emin olun:

android:finishOnTaskLaunch="true" 
0

deneyin yani oluşturmak üzerine önce Textospeech nesne oluşturun. globalde .try bu kodu ve hala birçok kez çağırıyor kontrol edin ????

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

} 
İlgili konular