2012-08-14 109 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