lightbulb_outline Please take our October 2018 developer survey. Start survey

添加语音功能

语音操作是穿戴式设备体验的重要组成部分。用户可通过语音操作快速地以免提方式执行操作。Wear 提供两种语音操作:

系统提供的语音操作
这些语音操作基于任务并内置于 Wear 平台。讲述语音操作时,在您要启动的 Activity 中过滤它们。例如,“请做笔记”或“设置闹铃”。
应用提供的语音操作
这些语音操作基于应用,并且您可以像声明启动图标一样声明它们。用户说“开始” 即可使用这些语音操作以及您指定启动的 Activity。

声明系统提供的语音操作

Android Wear 平台提供多个基于用户操作的语音 Intent,例如,“请做笔记”或“设置闹铃”等。这将允许用户说出他们想要执行的操作,并让系统确定要启动的最佳 Activity。

当用户说出语音操作时,您的应用可以过滤触发启动 Activity 的 Intent。如果您要启动一个 Service 以在后台执行某项操作,可显示一个 Activity 作为可视化线索,并在此 Activity 中启动该 Service。如果您想去除可视化线索,请务必调用 finish()

例如,对于“请做笔记”命令,声明此 Intent 过滤器以启动一个名为 MyNoteActivity 的 Activity:

  <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>

下面列出了 Wear 平台支持的语音 Intent 列表:

名称 示例语句 Intent
叫一台车/叫一台出租车 “OK Google,给我叫一台出租车”

“OK Google,给我叫一台车”
操作
com.google.android.gms.actions.RESERVE_TAXI_RESERVATION
请做笔记 “OK Google,请做笔记”

“OK Google,给我提醒”
操作
android.intent.action.SEND
类别
com.google.android.voicesearch.SELF_NOTE
Extra
android.content.Intent.EXTRA_TEXT - 带有笔记正文的字符串
设置闹铃 “OK Google,设置一个上午 8 点的闹铃”

“OK Google,明天 6 点唤醒我”
操作
android.intent.action.SET_ALARM
Extra
android.provider.AlarmClock.EXTRA_HOUR - 一个整数,表示闹铃的小时。

android.provider.AlarmClock.EXTRA_MINUTES - 一个整数,表示闹铃的分钟。

(这 2 个 Extra 都是可选的,要么不提供要么都提供)

设置定时器 “Ok Google,设置 10 分钟定时器”
操作
android.intent.action.SET_TIMER
Extra
android.provider.AlarmClock.EXTRA_LENGTH - 1 到 86400(24 小时的秒数)之间的一个整数,表示定时器的时长
启动跑步秒表 “Ok Google,启动跑步秒表”
操作
com.google.android.wearable.action.STOPWATCH
开始/停止骑行 “OK Google,开始骑行”

“OK Google,开始我的骑行”

“OK Google,停止骑行”
操作
vnd.google.fitness.TRACK
MIME 类型
vnd.google.fitness.activity/biking
Extra
actionStatus - 一个字符串,在开始时具有值 ActiveActionStatus,在停止时具有值 CompletedActionStatus
开始/停止跑步 “OK Google,跟踪我的跑步”

“OK Google,开始跑步”

“OK Google,停止跑步”
操作
vnd.google.fitness.TRACK
MimeType
vnd.google.fitness.activity/running
Extra
actionStatus - 一个字符串,在开始时具有值 ActiveActionStatus,在停止时具有值 CompletedActionStatus
开始/停止健身 “OK Google,开始锻炼”

“OK Google,跟踪我的锻炼”

“OK Google,停止锻炼”
操作
vnd.google.fitness.TRACK
MimeType
vnd.google.fitness.activity/other
Extra
actionStatus - 一个字符串,在开始时具有值 ActiveActionStatus,在停止时具有值 CompletedActionStatus
显示心率 “Ok Google,我的心率是多少?”

“Ok Google,我的 bpm 是多少?”
操作
vnd.google.fitness.VIEW
MIME 类型
vnd.google.fitness.data_type/com.google.heart_rate.bpm
显示步数 “Ok Google,我走了多少步?”

“Ok Google,我的步数是多少?”
操作
vnd.google.fitness.VIEW
MIME 类型
vnd.google.fitness.data_type/com.google.step_count.cumulative

有关注册平台 Intent 和访问其中包含的 Extra 信息的文档,请参阅常用 Intent

声明应用提供的语音操作

如果没有适合您的平台语音 Intent,您可以通过“Start MyActivityName”语音操作直接启动您的应用。

在手持式设备上,注册“启动”操作与注册启动图标相同。但不是请求启动器中的应用图标,而是由您的应用请求一个语音操作。

要指定“启动”后讲述的文本,可针对您想要启动的 Activtiy 指定一个 label 属性。例如,以下 Intent 过滤器可识别“Start MyRunningApp”语音操作并启动 StartRunActivity

<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>

获取自由格式的语音输入

除使用语音操作启动 Activity 外,您还可以调用系统的内置语音识别 Activity 以获取用户的语音输入。这对于从用户获取输入,然后进行处理(如执行搜索或将其作为消息发送)非常有用。

在您的应用中,使用 ACTION_RECOGNIZE_SPEECH 操作调用 startActivityForResult()。这将启动语音识别 Activity,然后,您可以在 onActivityResult() 中处理结果。
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);
}