2012-08-14 83 views
0

一次這是我的TTS服務代碼:廣播接收器的呼叫服務僅在循環

public class SMSTTSService extends Service implements TextToSpeech.OnInitListener, OnUtteranceCompletedListener { 

private TextToSpeech tts; 
private String spokenText; 

@Override 
public void onCreate() { 
    tts = new TextToSpeech(this, this);  
} 

@Override 
public void onInit(int status) {   
    if (status == TextToSpeech.SUCCESS) { 
     int result = tts.setLanguage(Locale.ENGLISH); 

     // tts.setPitch(5); // set pitch level 
     // tts.setSpeechRate(2); // set speech speed rate 

     if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) { 
      Log.e("TTS", "Language is not supported"); 
     } else {     
      speakOut(spokenText); 
     } 

     /*if (result != TextToSpeech.LANG_MISSING_DATA && result != TextToSpeech.LANG_NOT_SUPPORTED) { 
      tts.speak(c, TextToSpeech.QUEUE_FLUSH, null); 
     }*/ 
    } else { 
     Log.e("TTS", "Initilization Failed"); 
    } 
} 

private void speakOut(String text) { 
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null); 
} 

@Override 
public void onUtteranceCompleted(String uttId) { 
    stopSelf(); 
} 

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

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
}  

@Override 
public void onStart(Intent intent, int startId) { 
    super.onStart(intent, startId);  
    spokenText = intent.getStringExtra("spoken_txt"); 
} 

}

和接收我叫服務像

public class Receiver extends BroadcastReceiver { 

    private static final String TAG = "SMSReceiver"; 

    @Override 
    public void onReceive(Context context, Intent intent) { 


for(int i=0; i<msgs.length; i++) { 
.... 
Intent intentTTS = new Intent(context, SMSTTSService.class); 
         intentTTS.putExtra("spoken_txt", msgBody); 
         context.startService(intentTTS); 

} 

但服務只執行一次即使我有循環。如何讓我有更多的時間內循環語音?我做錯了什麼?

回答

3

我認爲你想爲多個實例使用IntentService類。

請參閱本:Multiple IntentService or one Service

編輯:這是表示環繞IntentService嚴格必要的代碼,一個簡單的例子:

public class ExampleIntentService extends IntentService { 
    private static final String TAG = ExampleIntentService.class.getName(); 

    public ExampleIntentService() { 
      super(TAG); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

      // The code you want to execute 
    } 
} 

爲了啓動該服務,你比如做:

Intent intent = new Intent(Intent.ACTION_SYNC, null, context, ExampleIntentService.class); 
     intent.putExtra(ExampleIntentService.EXTRA_DATA, "some data"); 
     context.startService(intent); 

然後,在清單中添加:

<service android:name="your.package.services.ExampleIntentService" /> 

現在,如果您想了解更多的細節,並與廣播接收器結合使用,我發現從谷歌的第一個結果,這些鏈接:

+0

有沒有其他的選擇,然後與服務? – senzacionale 2012-08-14 11:04:24

+0

IntentService是一種服務,使用context.startService(intent)以同樣的方式啓動。你只需要對你的SMSTTSService類進行一些修改就可以擴展IntentService,我想這不是什麼大問題。 – 2012-08-14 11:17:48

+0

感謝您提供更新的代碼,但ExampleIntentService類永遠不會執行 – senzacionale 2012-08-14 20:01:57

0

onStart()方法被多次調用,但它所做的只是將spokenText變量設置爲傳遞的額外值。所有這些都是在第一個Intent被髮言的時候發生的。然後你關閉服務。

你可能想要做的是實現一個簡單的隊列。在onStart()方法中提取附加內容並將口述文本添加到隊列中。然後開始處理隊列(如果它尚未被處理)。

處理隊列時,刪除隊列中的第一個元素並開始說話。在onUtteranceCompleted()方法中,刪除隊列中的第一個元素,如果有的話,開始講這個。當隊列中沒有元素時,停止服務。

應該工作。

+0

嗯謝謝,但接下來什麼時候接收器將被調用。服務永遠不會執行... – senzacionale 2012-08-14 15:20:42

+0

發佈您的新代碼,以便我們可以看到它。 – 2012-08-14 15:49:40