278 lines
9.7 KiB
Plaintext
278 lines
9.7 KiB
Plaintext
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>
|
||
<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>
|