2010-12-21 12 views
5

BroadcastReceiverのサブクラス内でTTSサービスを呼び出す必要があります。 OnInitListenerからそのクラスを実装すると、実行時エラーが発生しました。Android Call TTS in BroadcastReceiver

BroadcastReceiver内にTTSを実装する方法はありますか?

は、

申し訳ありませんが、コードをありがとう:

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

このエラーコードを投稿してください... – st0le

+0

申し訳ありません、私のソースコードを追加しました – Chandana

+0

こんにちは、この問題を解決する方法を知っていますか? – Chandana

答えて

6

をあなたのコードは、上で動作しませんでした:BroadcastReceiverの

tts = new TextToSpeech(context, this); 

コンテキストは "制限文脈" です。これは、BroadcastReceiverのコンテキストでサービスを開始できないことを意味します。 TTSはサービスなので、anytingを呼び出さない。

ベストソリューションは、サービスを呼び出すアクティビティを持つBroadcastReceiverに別のインテントを開始することです。

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); 
.... 
} 

そして活動にあなたが余分からのパラメータを持つTTSサービスを呼び出す

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は、話し終わりのアクティビティを終了するためのものです – faruk

1

アルZILの答えは完全に間違っています。 Android TTSは限定されたサービスです。放送受信者は本当に限られたコンテキストを持っていますが、どのサービスにもバインドすることはできません。しかし、彼らはサービスを開始することができます。アクティビティからのttsの開始は問題ありませんが、UIが必要ない場合は、サービスから初期化することもできます。どのように完了したかを見るにはthis answerをご覧ください。

幸運。