Reputation: 91
Hi how can I use the Voice Recognition to open intents, like email and text? I would like to use the sample code provided by android but this code only returns a list of phrases it thought it heard. Where can I change the code to open up an email intent when user voices "send email". From what I understand I can implement predetermined phrases for the listener to listen for. Can anyone show me in the code below where and how this is done?
/**
* Sample code that invokes the speech recognition intent API.
*/
public class VoiceRecognition extends Activity implements OnClickListener {
private static final int VOICE_RECOGNITION_REQUEST_CODE = 1234;
private ListView mList;
/**
* Called with the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Inflate our UI from its XML layout description.
setContentView(R.layout.voice_recognition);
// Get display items for later interaction
Button speakButton = (Button) findViewById(R.id.btn_speak);
mList = (ListView) findViewById(R.id.list);
// Check to see if a recognition activity is present
PackageManager pm = getPackageManager();
List<ResolveInfo> activities = pm.queryIntentActivities(
new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH), 0);
if (activities.size() != 0) {
speakButton.setOnClickListener(this);
} else {
speakButton.setEnabled(false);
speakButton.setText("Recognizer not present");
}
}
/**
* Handle the click on the start recognition button.
*/
public void onClick(View v) {
if (v.getId() == R.id.btn_speak) {
startVoiceRecognitionActivity();
}
}
/**
* Fire an intent to start the speech recognition activity.
*/
private void startVoiceRecognitionActivity() {
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "Speech recognition demo");
startActivityForResult(intent, VOICE_RECOGNITION_REQUEST_CODE);
}
/**
* Handle the results from the recognition activity.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
// Fill the list view with the strings the recognizer thought it could have heard
ArrayList<String> matches = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
matches));
}
super.onActivityResult(requestCode, resultCode, data);
}
}
Upvotes: 0
Views: 1566
Reputation: 5121
You could use the following code. Simply call the getVoice()
method when you want to listen for voice input, then have that automatically call searchVoiceArray()
as my code does which will match the possible reponses google provides with what your looking for.
public void getvoice() {
Intent i = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
i.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
i.putExtra(RecognizerIntent.ACTION_RECOGNIZE_SPEECH, RecognizerIntent.RESULT_AUDIO_ERROR);
startActivityForResult(i, check);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
if (requestCode == check && resultCode == RESULT_OK) {
result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
searchVoiceArray();
}
super.onActivityResult(requestCode, resultCode, data);
}
public void searchVoiceArray() {
int size = result.size();
int i = 0;
while (i < size) {
String s = result.get(i);
s.toLowerCase();
// next line removes all spaces in the string
// s= s.replaceAll(" ", "");
if (s.indexOf("text messaging") != -1 || s.indexOf("texts") != -1) {
i = size;
//Start text messaging intent Here
}
else if (s.indexOf("email") != -1) {
i = size;
//Start email intent Here
}
else
i++;
ArrayList<String> result = new ArrayList<String>();
Upvotes: 0
Reputation: 15669
public Interface Detector{
public boolean detect(List<String> matches);
}
public class OnStrictEmailListener implements Detector{
public boolean detect(List<String> matches){
if (matches.contains("send")
|| matches.contains("email")
|| matches.contains("send email")){
return true;
} else return false;
}
}
public class OnWeakEmailListener implements Detector{
public boolean detect(List<String> matches){
for (String match: matches){
if (match.contains("send")
|| match.contains("email")) return true
return false;
}
}
/**
* Handle the results from the recognition activity.
*/
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == VOICE_RECOGNITION_REQUEST_CODE && resultCode == RESULT_OK) {
// Fill the list view with the strings the recognizer thought it could have heard
ArrayList<String> YourMatchesToCheck = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
mList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
YourMatchesToCheck));
}
//Detector d = new OnStrictEmailListener();
Detector d = new OnWeakEmailListener();
if(d.detect(YourMatchesToCheck){
//....
} else {
//...
}
super.onActivityResult(requestCode, resultCode, data);
}
there you can start Intents check for other stuff etc
Upvotes: 1