2011-01-17 4 views
0

Ich konnte TTS von einer Aktivität ausführen, aber wenn ich versuche, den gleichen Code von einem Dienst auszuführen, gibt es mir Nachricht, dass TTS-Engine ist initialisiert, spricht aber nichts.TTS spricht nicht von einem Dienst, während es von einer Aktivität in Android tut

Hat jemand das gleiche Problem jederzeit?

public void onCreate() { 

    super.onCreate(); 
    tts = new TextToSpeech(this, this //TextToSpeech.OnInitListener); 

    timer.scheduleAtFixedRate(new TimerTask()      
    {         // In timer 

      public void run() { 
      //On some condition 
      tts.speak("thank you", TextToSpeech.QUEUE_ADD, null); 
    }, 0, 60000); 
    } 

    @Override 
    public void onInit(int status) { 
    if (status == TextToSpeech.SUCCESS) { 
    Toast.makeText(BackgroundProcessforTimecheck.this, 
    "Text-To-Speech engine is initialized", Toast.LENGTH_LONG).show(); 
} 
else if (status == TextToSpeech.ERROR) { 
    Toast.makeText(BackgroundProcessforTimecheck.this, 
    "Error occurred while initializing Text-To-Speech engine", Toast.LENGTH_LONG).show(); 
} 
} 

Kann mir bitte jemand helfen?

+0

Können Sie das im Service verwendete Code-Snippet posten? –

+0

Bitte überprüfen Sie meine bearbeitete Frage. – neha

+0

Veröffentlichen Sie die Protokolle mit Fehlern – mysuperass

Antwort

6

Ich hatte das gleiche Problem und löste es auf diese Weise: Instantiate TextToSpeech Objekt in einer separaten Klasse (in meinem Fall weiterhin ich eine Fabrik, um zu überprüfen, ob die Android Version mindestens Donut ist) und es Wiederverwendung (siehe Methode init (Kontext Kontext)). Bitte beachten Sie, dass der onInit (Int-Status) noch lange nicht bereit ist, veröffentlicht zu werden.

Service:

@Override 
public void onStart(Intent intent, int startId) { 
Context context = getApplicationContext(); 
TtsProviderFactory ttsProviderImpl = TtsProviderFactory.getInstance(); 
if (ttsProviderImpl != null) { 
    ttsProviderImpl.init(context); 
    ttsProviderImpl.say("hope that helps); 
}} 

Factory:

public abstract class TtsProviderFactory { 

public abstract void say(String sayThis); 

public abstract void init(Context context); 

public abstract void shutdown(); 


private static TtsProviderFactory sInstance; 

public static TtsProviderFactory getInstance() { 
    if (sInstance == null) { 
     int sdkVersion = Integer.parseInt(Build.VERSION.SDK); 
     if (sdkVersion < Build.VERSION_CODES.DONUT) { 
      return null; 
     } 

     try { 
      String className = "TtsProviderImpl"; 
      Class<? extends TtsProviderFactory> clazz = 
        Class.forName(TtsProviderFactory.class.getPackage().getName() + "." + className) 
          .asSubclass(TtsProviderFactory.class); 
      sInstance = clazz.newInstance(); 
     } catch (Exception e) { 
      throw new IllegalStateException(e); 
     } 
    } 
    return sInstance; 
}} 

Umsetzung:

public class TtsProviderImpl extends TtsProviderFactory implements TextToSpeech.OnInitListener { 

private TextToSpeech tts; 

public void init(Context context) { 
    if (tts == null) { 
     tts = new TextToSpeech(context, this); 
    } 
} 

@Override 
public void say(String sayThis) { 
    tts.speak(sayThis, TextToSpeech.QUEUE_FLUSH, null); 
} 

@Override 
public void onInit(int status) { 
    Locale loc = new Locale("de", "", ""); 
    if (tts.isLanguageAvailable(loc) >= TextToSpeech.LANG_AVAILABLE) { 
     tts.setLanguage(loc); 
    } 
} 

public void shutdown() { 
    tts.shutdown(); 
}} 
0

Haben Sie die TTS-Engine in Ihrem Gerät installiert. Auch ich hatte dasselbe Problem mit derselben Nachricht. Aber später stellte ich fest, dass ich die TTS-Engine auch auf meinem echten Gerät installieren muss und es im Play Store erhältlich ist.