2013-07-29 66 views
2

我已經查看了幾個線程,詢問有關從服務運行TTS的問題(抱歉,不記得哪些),但沒有一個幫助。如何在IntentService中運行Android TTS

的IntentService開始就好了,但它的OnInit之前被銷燬()運行這是什麼,我相信是導致此logcat的:

07-28 18:58:24.716 2305-2305/me.arthurtucker.alfredjr D/MainActivity: onPrefChange 
07-28 18:58:24.786 2305-2305/me.arthurtucker.alfredjr D/MainActivity: made new intent 
07-28 18:58:24.794 2305-2305/me.arthurtucker.alfredjr D/MainActivity: started service 
07-28 18:58:25.044 2305-2305/me.arthurtucker.alfredjr I/SpeachService: onCreate() ran 
07-28 18:58:25.255 2305-2573/me.arthurtucker.alfredjr I/TextToSpeech: Sucessfully bound to com.google.android.tts 
07-28 18:58:25.255 2305-2573/me.arthurtucker.alfredjr I/SpeachService: onHandleIntent ran 
07-28 18:58:25.255 2305-2305/me.arthurtucker.alfredjr W/TextToSpeech: stop failed: not bound to TTS engine 
07-28 18:58:25.255 2305-2305/me.arthurtucker.alfredjr W/TextToSpeech: shutdown failed: not bound to TTS engine 
07-28 18:58:25.255 2305-2305/me.arthurtucker.alfredjr I/SpeachService: onDestroy() ran 
07-28 18:58:25.286 2305-2305/me.arthurtucker.alfredjr E/ActivityThread: Service me.arthurtucker.alfredjr.SpeechService has leaked ServiceConnection [email protected] that was originally bound here 
     android.app.ServiceConnectionLeaked: Service me.arthurtucker.alfredjr.SpeechService has leaked ServiceConnection [email protected] that was originally bound here 
     at android.app.LoadedApk$ServiceDispatcher.<init>(LoadedApk.java:969) 
     at android.app.LoadedApk.getServiceDispatcher(LoadedApk.java:863) 
     at android.app.ContextImpl.bindService(ContextImpl.java:1437) 
     at android.app.ContextImpl.bindService(ContextImpl.java:1426) 
     at android.content.ContextWrapper.bindService(ContextWrapper.java:473) 
     at android.speech.tts.TextToSpeech.connectToEngine(TextToSpeech.java:627) 
     at android.speech.tts.TextToSpeech.initTts(TextToSpeech.java:597) 
     at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:553) 
     at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:527) 
     at android.speech.tts.TextToSpeech.<init>(TextToSpeech.java:512) 
     at me.arthurtucker.alfredjr.SpeechService.onHandleIntent(SpeechService.java:37) 
     at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
     at android.os.Handler.dispatchMessage(Handler.java:99) 
     at android.os.Looper.loop(Looper.java:137) 
     at android.os.HandlerThread.run(HandlerThread.java:60) 

我已經試過的onCreate(),onHandleIntent運行sayString() (),現在onInit()。當的onCreate()或onHandleIntent()的logcat的報道是這樣的:「失敗說:不綁定到TTS引擎」。

有沒有辦法有IntentService等待的OnInit()銷燬

之前運行?

我的代碼如下。

public class SpeechService extends IntentService implements TextToSpeech.OnInitListener, TextToSpeech.OnUtteranceCompletedListener { 
    private static TextToSpeech myTTS; 
    private Main mActivity; 
    private static final String TAG = "SpeachService"; 
    //private String msg; 

    public SpeechService() { 
     super("SpeechService"); 
    } 

    @Override 
    public void onCreate() { 
     mActivity = new Main(); 
     super.onCreate(); 
     Log.i(TAG, "onCreate() ran"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Intent checkTTSIntent = new Intent(); 
     checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA); 
     myTTS = new TextToSpeech(this, this); 
     //String msg = intent.getStringExtra("imsg"); 
     Log.i(TAG, "onHandleIntent ran"); 
    } 

    public void sayString(String string) { 
     if (myTTS != null) { 
      if (mActivity.mEnabled) { 
       HashMap<String, String> hashMap = new HashMap<String, String>(); 
       hashMap.put(TextToSpeech.Engine.KEY_FEATURE_NETWORK_SYNTHESIS, "true"); 
       myTTS.speak(string, 1, hashMap); 
      } else { 
       myTTS.speak(string, 1, null); 
      } 
     } 

     Log.i(TAG, "sayString() ran"); 
    } 

    @Override 
    public void onDestroy() { 
     // TODO Auto-generated method stub 
     if (myTTS != null) { 
      myTTS.stop(); 
      myTTS.shutdown(); 
     } 
     super.onDestroy(); 
     Log.i(TAG, "onDestroy() ran"); 
    } 

    @Override 
    public void onInit(int initStatus) { 
     if (initStatus == TextToSpeech.SUCCESS) { 
      if (myTTS.isLanguageAvailable(Locale.UK) == TextToSpeech.LANG_AVAILABLE) { 
       myTTS.setLanguage(Locale.UK); 
      } 
      sayString("IT WORKS"); 
     } else if (initStatus == TextToSpeech.ERROR) { 
      mActivity.makeToast("Failed to start Text-to-Speech Service", true); 
     } 
     Log.i(TAG, "onInit() ran"); 
    } 

    @Override 
    public void onUtteranceCompleted(String s) { 
     stopSelf(); 
     Log.i(TAG, "onUtteranceCompleted() ran"); 
    } 
} 

我願意嘗試一些完全不同的方法,只要它做類似的事情。

回答

2

你是不是叫onInit()明確。IntentService被破壞一次調用onHandleIntent方法。確保你在onHandleIntent方法中完成所有工作。

onHandleIntent(意向意圖)從文檔:

This method is invoked on the worker thread with a request to process. Only one Intent is processed at a time, but the processing happens on a worker thread that runs independently from other application logic. So, if this code takes a long time, it will hold up other requests to the same IntentService, but it will not hold up anything else. When all requests have been handled, the IntentService stops itself, so you should not call stopSelf().

+0

我以爲當TTS初始化的OnInit()被自動調用。我從來不需要在其他應用程序上調用它。 – Altkey

+2

使用'Service'而不是'IntentService',並在需要使用'stopSelf()'方法時手動停止'Service'。 – ARMAGEDDON

+0

您可以使用意圖來實現此目的。例如'Service's中的'onStartCommand'。請你能更具體地說明這種情況,現在你想要什麼?謝謝。 – ARMAGEDDON