1

Android 2.3.it에서 동일한 코드를 사용해 보았는데 완벽하게 작동합니다. 내가 이미 Android 4.0과 함께 사용했던 것을 기억합니다. Nexus 4Nexus 7Android 4.4.2 onInit 메서드에서 애플리케이션을 호출하려고하지 않습니다. 누군가 나에게이 이유를 알거나 다른 구현 방법을 제안하겠습니까? 나는 이유를 알고하지 않습니다하지만 AsyncTask를을 시작하는 방법에 대한 호출을 제거, 모두 밖으로 일 :onInit은 Android 4.4.2에서 새로운 TextToSpeech 인스턴스를 만들 때 결코 발생하지 않습니다.

public class MyFragment extends Fragment implements TextToSpeech.OnInitListener{ 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_recognition, container, false); 

     return v; 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     // check for TTS data 
     Intent checkTTSIntent = new Intent(); 
     checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
     startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE); 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     if(myTTS != null) { 
      myTTS.stop(); 
      myTTS.shutdown(); 
     } 
    } 

    @Override 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 

     if (requestCode == MY_DATA_CHECK_CODE) { 
      if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) { 
       // the user has the necessary data - create the TTS 
       myTTS = new TextToSpeech(getActivity(), this); 
      } else { 
       //no data - install it now 
       Intent installTTSIntent = new Intent(); 
       installTTSIntent.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA); 
       startActivity(installTTSIntent); 
      } 
     } 
    } 

    // setup TTS 
    public void onInit(int initStatus) { 
     // check for successful instantiation 
     // if (initStatus == TextToSpeech.SUCCESS) { 
     // if(myTTS.isLanguageAvailable(Locale.US)==TextToSpeech.LANG_AVAILABLE) 
     myTTS.setLanguage(Locale.ITALIAN); 
     // } 
     // else if (initStatus == TextToSpeech.ERROR) { 
     // Toast.makeText(this, "Sorry! Text To Speech failed...", 
     // Toast.LENGTH_LONG).show(); 
     // } 
     speak("Sintesi Vocale Attiva"); 
    } 

    private void speak(String speech) { 
     HashMap<String, String> hashMap = new HashMap<String, String>(); 
     hashMap.put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "true"); 
     myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, hashMap); 
    } 
} 
+0

logcat에서 무엇을 볼 수 있습니까? onActivityResult가 호출되는지 확인하기 위해 로깅을 추가 했습니까? 그렇지 않으면 TTS 객체가 초기화되지 않습니다. – brandall

+0

예, onActivityResult가 호출되었습니다. TextToSpeech 개체가 초기화되었지만 OnInit이 호출되지 않았습니다. – INDAPP

+0

초기화 상태 란 무엇입니까? 그걸 기록 했니? – brandall

답변

3

문제 해결. 이 메소드는 onCreateView에서 호출되었으며 UDP 데이터 그램을 수신하는 데 필요한대로 TTS와 관련이 없습니다.

+0

좋습니다! 내 문제가 해결 됐어! – Burf2000

3

Android 4.4.2에서 TTS 엔진을 초기화 할 때 AsyncTask 처리와 관련된 문제가있는 것으로 보입니다.

다른 사람이이 문제에 직면 한 경우이 조건을 체크 아웃하는 일부 루프와 함께 onInit 메서드가 호출 될 때까지 기다린 다음 AsyncTask 프로세스가 시작될 때까지 기다리는 것이 좋습니다 (TTS와 관련되지 않은 경우에도 계속 수행하는 것이 좋습니다.). 그게 적어도 나를 위해 일한 ...

+0

이유는 Honecomb 이후 장치의 AsyncTasks가 도넛과 달리 보안 적으로 실행되기 때문입니다. 이것은 http://edveloper.android.com/reference/android/os/AsyncTask.html을 읽은 후 내가 한 수호입니다. – AlexSanchez

-1

작업 arround로, 음성 작업이 초기화 될 때까지 비동기 작업의 시작을 지연시키는 타이머 작업을 시작할 수 있습니다. 타이머 작업은 UI 스레드에서 비동기 작업을 시작하는 실행 파일을 시작해야합니다. 제 경우에는 1 초의 지연이 좋았습니다.