2010-12-21 16 views
5

BroadcastReceiver alt sınıfında TTS servisini aramam gerekiyor. Bu sınıfı OnInitListener'dan uyguladığımda, çalışma zamanı hatası verdi.Android arama TTS in BroadcastReceiver

BroadcastReceiver içinde TTS'yi uygulamak için başka bir yol var mı? BroadcastReceiver üzerinde

tts = new TextToSpeech(context, this); 

Bağlam bir "kısıtlı bağlam" dir:

public class TextApp extends BroadcastReceiver implements OnInitListener { 
private TextToSpeech tts; 
private String message = "Hello"; 


@Override 
public void onReceive(Context context, Intent intent) { 
    tts = new TextToSpeech(context, this); 
    message = "Hello TTS"; 
} 

@Override 
public void onInit(int status) { 
    if (status == TextToSpeech.SUCCESS) 
    { 
     tts.speak(message, TextToSpeech.QUEUE_FLUSH, null); 
    } 


} 
} 
+0

Hatalı kodu yollayın ... – st0le

+0

Üzgünüz, kaynak kodumu ekledim – Chandana

+0

Merhaba, bu sorunu nasıl çözdüğümü biliyor musunuz? – Chandana

cevap

6

Kodunuz işe yaramadı:

Maalesef Kod, teşekkür ederim. BroadcastReceiver'da içerik üzerinde hizmet başlatamayacağınız anlamına gelir. TTS bir hizmet olduğu için, hiçbir şekilde arama yapmaz.

En İyi Çözümler, BroadcastReceiver'da hizmeti çağıran bir etkinlikle başka bir amaç başlatır.

public void onReceive(Context context, Intent intent) { 
.... 

    Intent speechIntent = new Intent(); 
    speechIntent.setClass(context, ReadTheMessage.class); 
    speechIntent.putExtra("MESSAGE", message.getMessageBody().toString()); 
    speechIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); 
    context.startActivity(speechIntent); 
.... 
} 

Sonra aktivitesi üzerine size

public class ReadTheMessage extends Activity implements OnInitListener,OnUtteranceCompletedListener { 

private TextToSpeech tts = null; 
private String msg = ""; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Intent startingIntent = this.getIntent(); 
    msg = startingIntent.getStringExtra("MESSAGE"); 
    tts = new TextToSpeech(this,this); 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if (tts!=null) { 
     tts.shutdown(); 
    } 
} 

// OnInitListener impl 
public void onInit(int status) { 
    tts.speak(msg, TextToSpeech.QUEUE_FLUSH, null); 
} 

// OnUtteranceCompletedListener impl 
public void onUtteranceCompleted(String utteranceId) { 
    tts.shutdown(); 
    tts = null; 
    finish(); 
} 
} 
+0

OnUtteranceCompletedListener, Konuşmanın sonunda Etkinlik bitirmek içindir – faruk

1

Al Zil cevap tamamen doğru değil ekstralar gelen parametre ile TTS hizmetlerini arayın. Android TTS sınırlı bir hizmettir. Yayın alıcıları gerçekten sınırlı bir içeriğe sahiptir, ancak kendilerini herhangi bir hizmete bağlayamazlar. Ancak, bir hizmeti başlatabilirler. Etkinlikten tts başlama tamam, ancak UI'ye ihtiyacınız yoksa, bir hizmetten de başlatabilirsiniz. Nasıl yapıldığını görmek için this answer adresine bakın.

İyi şanslar.