I just completed the coding to have the text to speech button read the text on the button the user pressed.For some reason every button says the text on the first button instead of their own text. Obviously this is a problem because you don't want every button saying the same thing. It registers no errors in my LogCat so it works fine, just not the way I want it to. I don't have the java experience to find the source of the problem.
public class menu extends Activity implements TextToSpeech.OnInitListener,
OnClickListener {
TextToSpeech mTts;
Button speakButton, infoButton, voiceButton;
// TTS object
public TextToSpeech myTTS;
// status check code
public int MY_DATA_CHECK_CODE = 0;
@Override
protected void onCreate(Bundle aboutmenu) {
super.onCreate(aboutmenu);
setContentView(R.layout.mainx);
SpeakingAndroid speak = new SpeakingAndroid();
VoiceRecognition voiceinput = new VoiceRecognition();
// get a reference to the button element listed in the XML layout
speakButton = (Button) findViewById(R.id.btn_speak);
infoButton = (Button) findViewById(R.id.aboutbutton);
voiceButton = (Button) findViewById(R.id.voicebutton);
// listen for clicks
infoButton.setOnClickListener(this);
speakButton.setOnClickListener(this);
// check for TTS data
Intent checkTTSIntent = new Intent();
checkTTSIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkTTSIntent, MY_DATA_CHECK_CODE);
voiceButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
}
});
}
public void onClick1(View about) {
// get the text entered
infoButton = (Button) findViewById(R.id.aboutbutton);
String words = infoButton.getText().toString();
speakWords(words);
Intent infoIntent = new Intent("android.intent.action.INFOSCREEN");
startActivity(infoIntent);
}
// respond to button clicks
public void onClick(View v) {
// get the text entered
speakButton = (Button) findViewById(R.id.btn_speak);
String words = speakButton.getText().toString();
speakWords(words);
Intent voiceIntent = new Intent("android.intent.action.RECOGNITIONMENU");
startActivity(voiceIntent);
}
// speak the user text
public void speakWords(String speech) {
// speak straight away
myTTS.speak(speech, TextToSpeech.QUEUE_FLUSH, null);
}
// act on result of TTS data check
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
// the user has the necessary data - create the TTS
myTTS = new TextToSpeech(this, this);
} else {
// no data - install it now
Intent installTTSIntent = new Intent();
installTTSIntent
.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installTTSIntent);
}
}
}
// setup TTS
public void onInit(int initStatus) {
// check for successful instantiation
if (initStatus == TextToSpeech.SUCCESS) {
if (myTTS.isLanguageAvailable(Locale.US) == TextToSpeech.LANG_AVAILABLE)
myTTS.setLanguage(Locale.US);
} else if (initStatus == TextToSpeech.ERROR) {
Toast.makeText(this, "Sorry! Text To Speech failed...",
Toast.LENGTH_LONG).show();
}
}
}
Declare a text to speech attribute in your activity
private TextToSpeech mTTS;
Instantiate your Text to speech Object in your Activity
mTTS=new TextToSpeech(this,this);
Get a reference to your buttons listed in the XML layout
speakButton = (Button) findViewById(R.id.btn_speak);
infoButton = (Button) findViewById(R.id.btn_about);
voiceButton = (Button) findViewById(R.id.btn_voice);
Listen to ClickEvents for your Button, your activity must implement the View.OnClickListener
interface
infoButton.setOnClickListener(this);
speakButton.setOnClickListener(this);
voiceButton.setOnClickListener(this);
Handle Click Events in th Overriden onClick() method:
@Override
public void onClick(View v) {
switch(v.getId())
{
case R.id.btn_speak:
mTTS.speak(speakButton.getText().toString(), TextToSpeech.QUEUE_ADD, null);
break;
case R.id.btn_about:
mTTS.speak(infoButton.getText().toString(), TextToSpeech.QUEUE_ADD, null);
break;
case R.id.btn_voice:
mTTS.speak(voiceButton.getText().toString(), TextToSpeech.QUEUE_ADD, null);
break;
}
}