
When I first began programming for Wear OS I was expecting an easy out of the box method for getting user input similar to how Google Play works. Giving the user the option to speak or type and also a list of canned inputs to choose from.
Unfortunately, this isn’t as easy as I thought and the developer page seemed pretty vague and unhelpful, but with a little work I was able to come up with a pretty small script to accomplish what I needed to do. I will explain the basics of this in the following post.
To begin, create a layout that looks something like this:
I use a Dismiss Layout as the wrapper so the user can swipe the input away if they change there mind and a Box Inset layout to make sure it is readable on any screen inside that. A scroll view isn’t necessary if you aren’t going to include any canned responses. I also include a microphone button and a keyboard button.
I use a Fragment class to include all the code for the input. Here’s the basic code for getting the input from the mic:
// Create an intent that can start the Speech Recognizer activity private void displaySpeechRecognizer() { Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL, RecognizerIntent.LANGUAGE_MODEL_FREE_FORM); // Start the activity, the intent will be populated with the speech text startActivityForResult(intent, SPEECH_REQUEST_CODE); }
this is the function to run when the user clicks on the voice input button. It starts the speech recognizer intent a private integer variable can be used for theĀ SPEECH_REQUEST_CODE so we can get the result back later by overridingĀ onActivityResult.
@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { Cat.d("Got Request Code " + SPEECH_REQUEST_CODE + " " + requestCode); Cat.d("Got Result Code " + resultCode + " " + RESULT_OK); if (requestCode == SPEECH_REQUEST_CODE) { try { List<String> results = data.getStringArrayListExtra( RecognizerIntent.EXTRA_RESULTS); String spokenText = results.get(0); sendResult(spokenText); } catch (NullPointerException ex) { Cat.d("No result received"); // If they are using android wear 1.x, back out now if(Build.VERSION.SDK_INT == Build.VERSION_CODES.M) { removeThis(); } } } super.onActivityResult(requestCode, resultCode, data); }
This function runs when a result comes back. We need to check to make sure the the code we sent matches then get the first result. There is also the possibility that there won’t be a result. If this is the case, we either do nothing or just remove the fragment if it is android wear 1 since there is not keyboard input.
In the next part, I will explain an easy way to get keyboard input without leaving the app.