我已经查看了几个线程,询问有关从服务运行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");
}
}
我愿意尝试一些完全不同的方法,只要它做类似的事情。
我以为当TTS初始化的OnInit()被自动调用。我从来不需要在其他应用程序上调用它。 – Altkey
使用'Service'而不是'IntentService',并在需要使用'stopSelf()'方法时手动停止'Service'。 – ARMAGEDDON
您可以使用意图来实现此目的。例如'Service's中的'onStartCommand'。请你能更具体地说明这种情况,现在你想要什么?谢谢。 – ARMAGEDDON