| page.title=Adding Voice Capabilities |
| @jd:body |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| |
| <!-- Required platform, tools, add-ons, devices, knowledge, etc. --> |
| <h2>This lesson teaches you to</h2> |
| <ol> |
| <li><a href="#SystemProvided">Declare System-provided Voice Actions</a></li> |
| <li><a href="#AppProvided">Declare App-provided Voice Actions</a></li> |
| <li><a href="#FreeFormSpeech">Obtaining Free-form Speech Input</a></li> |
| </ol> |
| <h2>You should also read</h2> |
| <ul> |
| <li><a href="{@docRoot}design/wear/index.html">Android Wear Design Principles</a></li> |
| </ul> |
| </div> |
| </div> |
| |
| <p>Voice actions are an important part of the wearable experience. They let users carry |
| out actions hands-free and quickly. Wear provides two types of voice actions:</p> |
| |
| <dl> |
| <dt><b>System-provided</b></dt> |
| <dd>These voice actions are task-based and are built |
| into the Wear platform. You filter for them in the activity that you want to start when the |
| voice action is spoken. Examples include "Take a note" or "Set an alarm".</dd> |
| <dt><b>App-provided</b></dt> |
| <dd>These voice actions are app-based, and you declare them just like a launcher icon. |
| Users say "Start <Your App Name>" to use these voice actions and an activity that you specify |
| starts.</dd> |
| </dl> |
| |
| <h2 id="SystemProvided" style="clear:right">Declare System-provided Voice Actions</h2> |
| <p> |
| The Android Wear platform provides several voice intents that are based on user actions such |
| as "Take a note" or "Set an alarm". This allows users to say what they want to do and let |
| the system figure out the best activity to start.</p> |
| |
| <p>When users speak the voice action, your app can filter for the intent that is fired to start |
| an activity. If you want to start a service to do something in the background, show an activity as |
| a visual cue and start the service in the activity. Make sure to call |
| {@link android.app.Activity#finish finish()} when you want to get rid of the visual cue. |
| </p> |
| |
| <p>For example, for the "Take a note" command, declare this intent filter to start an activity |
| named <code>MyNoteActivity</code>: |
| </p> |
| |
| <pre> |
| <activity android:name="MyNoteActivity"> |
| <intent-filter> |
| <action android:name="android.intent.action.SEND" /> |
| <category android:name="com.google.android.voicesearch.SELF_NOTE" /> |
| </intent-filter> |
| </activity> |
| </pre> |
| |
| <p>Here is a list of the voice intents supported by the Wear platform:</p> |
| |
| <table> |
| <tr> |
| <th>Name</th> |
| <th>Example Phrases</th> |
| <th>Intent</th> |
| </tr> |
| |
| <tr> |
| <td>Call a car/taxi</td> |
| <td>"OK Google, get me a taxi"<br/><br/>"OK Google, call me a car"</td> |
| <td> |
| <dl> |
| <dt>Action</dt> |
| <dd> |
| <code>com.google.android.gms.actions.RESERVE_TAXI_RESERVATION</code> |
| </dd> |
| </dl> |
| </td> |
| </tr> |
| |
| <tr> |
| <td>Take a note</td> |
| <td>"OK Google, take a note"<br/><br/>"OK Google, note to self"</td> |
| <td> |
| <dl> |
| <dt>Action</dt> |
| <dd><code>android.intent.action.SEND</code></dd> |
| <dt>Category</dt> |
| <dd><code>com.google.android.voicesearch.SELF_NOTE</code></dd> |
| <dt>Extras</dt> |
| <dd><code>android.content.Intent.EXTRA_TEXT</code> - a string with note body</dd> |
| </dl> |
| </td> |
| </tr> |
| |
| <tr> |
| <td>Set alarm</td> |
| <td>"OK Google, set an alarm for 8 AM"<br/><br/>"OK Google, wake me up at 6 tomorrow"</td> |
| <td> |
| <dl> |
| <dt>Action</dt> |
| <dd><code>android.intent.action.SET_ALARM</code></dd> |
| <dt>Extras</dt> |
| <dd><code>android.provider.AlarmClock.EXTRA_HOUR</code> - an integer with the hour of |
| the alarm. |
| <p><code>android.provider.AlarmClock.EXTRA_MINUTES</code> - |
| an integer with the minute of the alarm |
| <p>(these 2 extras are optional, either none or |
| both are provided)</p></dd> |
| |
| </dl> |
| </td> |
| </tr> |
| |
| <tr> |
| <td>Set timer</td> |
| <td>"Ok Google, set a timer for 10 minutes"</td> |
| <td> |
| <dl> |
| <dt>Action</dt> |
| <dd><code>android.intent.action.SET_TIMER</code></dd> |
| <dt>Extras</dt> |
| <dd><code>android.provider.AlarmClock.EXTRA_LENGTH</code> - an integer in the range of |
| 1 to 86400 (number of seconds in 24 hours) representing the length of the timer </dd> |
| </dl> |
| </td> |
| </tr> |
| |
| <tr> |
| <td>Start/Stop a bike ride</td> |
| <td>"OK Google, start cycling"<br/><br/>"OK Google, start my bike ride"<br/><br/>"OK Google, stop cycling"</td> |
| <td> |
| <dl> |
| <dt>Action</dt> |
| <dd><code>vnd.google.fitness.TRACK</code></dd> |
| <dt>Mime Type</dt> |
| <dd><code>vnd.google.fitness.activity/biking</code></dd> |
| <dt>Extras</dt> |
| <dd><code>actionStatus</code> - a string with the value <code>ActiveActionStatus</code> |
| when starting and <code>CompletedActionStatus</code> when stopping.</dd> |
| </dl> |
| </td> |
| </tr> |
| |
| <tr> |
| <td>Start/Stop a run</td> |
| <td>"OK Google, track my run"<br/><br/>"OK Google, start running"<br/><br/>"OK Google, stop running"</td> |
| <td> |
| <dl> |
| <dt>Action</dt> |
| <dd><code>vnd.google.fitness.TRACK</code></dd> |
| <dt>MimeType</dt> |
| <dd><code>vnd.google.fitness.activity/running</code></dd> |
| <dt>Extras</dt> |
| <dd><code>actionStatus</code> - a string with the value <code>ActiveActionStatus</code> |
| when starting and <code>CompletedActionStatus</code> when stopping</dd> |
| </dl> |
| </td> |
| </tr> |
| |
| |
| <tr> |
| <td>Start/Stop a workout</td> |
| <td>"OK Google, start a workout"<br/><br/>"OK Google, track my workout"<br/><br/>"OK Google, stop workout"</td> |
| <td> |
| <dl> |
| <dt>Action</dt> |
| <dd><code>vnd.google.fitness.TRACK</code></dd> |
| <dt>MimeType</dt> |
| <dd><code>vnd.google.fitness.activity/other</code></dd> |
| <dt>Extras</dt> |
| <dd><code>actionStatus</code> - a string with the value <code>ActiveActionStatus</code> |
| when starting and <code>CompletedActionStatus</code> when stopping</dd> |
| </dd> |
| </dl> |
| </td> |
| </tr> |
| |
| <tr> |
| <td>Show heart rate</td> |
| <td>"OK Google, what’s my heart rate?"<br/><br/>"OK Google, what’s my bpm?"</td> |
| <td> |
| <dl> |
| <dt>Action</dt> |
| <dd><code>vnd.google.fitness.VIEW</code></dd> |
| <dt>Mime Type</dt> |
| <dd><code>vnd.google.fitness.data_type/com.google.heart_rate.bpm</code></dd> |
| </dd> |
| </dl> |
| </td> |
| </tr> |
| |
| <tr> |
| <td>Show step count</td> |
| <td>"OK Google, how many steps have I taken?"<br/><br/>"OK Google, what’s my step count?"</td> |
| <td> |
| <dl> |
| <dt>Action</dt> |
| <dd><code>vnd.google.fitness.VIEW</code></dd> |
| <dt>Mime Type</dt> |
| <dd><code>vnd.google.fitness.data_type/com.google.step_count.cumulative</code></dd> |
| </dd> |
| </dl> |
| </td> |
| </tr> |
| |
| </table> |
| |
| <p> |
| For documentation on registering for platform intents and accessing the extras information |
| contained in them, see <a href="{@docRoot}guide/components/intents-common.html">Common intents</a>. |
| </p> |
| |
| <h2 id="AppProvided">Declare App-provided Voice Actions</h2> |
| <p> |
| If none of the platform voice intents work for you, you can start your apps directly with |
| a "Start MyActivityName" voice action. </p> |
| |
| <p>Registering for a "Start" action is the same as registering |
| for a launcher icon on a handheld. Instead of requesting an app icon in a launcher, |
| your app requests a voice action instead.</p> |
| |
| <p>To specify the text to say after "Start", specify a <code>label</code> attribute for the activtiy |
| that you want to start. For example, this intent filter recognizes the |
| "Start MyRunningApp" voice action and launches <code>StartRunActivity</code>. |
| </p> |
| |
| <pre> |
| <application> |
| <activity android:name="StartRunActivity" android:label="MyRunningApp"> |
| <intent-filter> |
| <action android:name="android.intent.action.MAIN" /> |
| <category android:name="android.intent.category.LAUNCHER" /> |
| </intent-filter> |
| </activity> |
| </application> |
| </pre> |
| |
| <h2 id="FreeFormSpeech">Obtaining Free-form Speech Input</h2> |
| <p>In addition to using voice actions to launch activities, you can also call the system's |
| built-in Speech Recognizer activity to obtain speech input from users. This is useful to obtain input |
| from users and then process it, such as doing a search or sending it as a message.</p> |
| |
| In your app, you call {@link android.app.Activity#startActivityForResult startActivityForResult()} using |
| the {@link android.speech.RecognizerIntent#ACTION_RECOGNIZE_SPEECH} action. This starts the |
| speech recognition activity, and you can then handle the result |
| in {@link android.app.Activity#onActivityResult onActivityResult()}. |
| <pre> |
| private static final int SPEECH_REQUEST_CODE = 0; |
| |
| // 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 callback is invoked when the Speech Recognizer returns. |
| // This is where you process the intent and extract the speech text from the intent. |
| @Override |
| protected void onActivityResult(int requestCode, int resultCode, |
| Intent data) { |
| if (requestCode == SPEECH_REQUEST_CODE && resultCode == RESULT_OK) { |
| List<String> results = data.getStringArrayListExtra( |
| RecognizerIntent.EXTRA_RESULTS); |
| String spokenText = results.get(0); |
| // Do something with spokenText |
| } |
| super.onActivityResult(requestCode, resultCode, data); |
| } |
| </pre> |