2013-07-29 36 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