blob: 6d493196bfe4ed546c4174b83942be20fefc68df [file] [log] [blame]
page.title=Adding Voice Capabilities
page.tags=wear
helpoutsWidget=true
@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>
&lt;activity android:name="MyNoteActivity"&gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.SEND" /&gt;
&lt;category android:name="com.google.android.voicesearch.SELF_NOTE" /&gt;
&lt;/intent-filter&gt;
&lt;/activity&gt;
</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>
&lt;application&gt;
&lt;activity android:name="StartRunActivity" android:label="MyRunningApp"&gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.MAIN" /&gt;
&lt;category android:name="android.intent.category.LAUNCHER" /&gt;
&lt;/intent-filter&gt;
&lt;/activity&gt;
&lt;/application&gt;
</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.
&#64;Override
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == SPEECH_REQUEST_CODE && resultCode == RESULT_OK) {
List&lt;String&gt; results = data.getStringArrayListExtra(
RecognizerIntent.EXTRA_RESULTS);
String spokenText = results.get(0);
// Do something with spokenText
}
super.onActivityResult(requestCode, resultCode, data);
}
</pre>