2010-12-21 15 views
5

Necesito llamar al servicio TTS dentro de la subclase de BroadcastReceiver. Cuando estoy implementando esa clase desde OnInitListener, me dio un error en tiempo de ejecución.llamada Android TTS en BroadcastReceiver

¿Hay alguna otra forma de implementar TTS dentro de BroadcastReceiver?

gracias,

Código sentimos:

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

Publique ese código defectuoso ... – st0le

+0

Lo siento, he agregado mi código fuente – Chandana

+0

¿Alguien sabe cómo solucionar este problema? – Chandana

Respuesta

6

Su código no funcionaba en:

tts = new TextToSpeech(context, this); 

Contexto de BroadcastReceiver es un "contexto restringido". Significa que no puede iniciar el servicio en contexto en BroadcastReceiver. Como TTS es un servicio, no llama a anyting.

The Best Solutions es que comienza otra intención en BroadcastReceiver con actividad que llama al servicio.

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

Y luego de la actividad que llamar al servicio de TTS con el parámetro de extras

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 es para finalizar la actividad al final de Speak – faruk

1

Al Zil respuesta no es totalmente correcto. Android TTS es un servicio limitado. Los receptores de difusión realmente tienen un contexto limitado, pero no pueden vincularse a ningún servicio. Sin embargo, pueden INICIAR un servicio. Iniciar las tts desde la actividad está bien, pero si no necesita UI, también puede inicializarlo desde un servicio. Mire this answer para ver cómo se hace

Buena suerte.

Cuestiones relacionadas