2011-01-27 4 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 나 I에 대한 운이 좋게 서비스에서 문제를 해결 한 활동에서 제 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(); 
    } 
} 

} 
관련 문제