mandam
mandam

Reputation: 91

How can I use Voice Recognition to open intents, like email and text messaging?

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

Answers (2)

Peter
Peter

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

Rafael T
Rafael T

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

Related Questions