十五、设备功能

本章概述了 Windows 10 应用中的设备功能。您还将了解如何在您的 UWP 应用中开发蓝牙、文本到语音、语音到文本和传感器功能。本章还概述了 Cortana 在应用中的集成。

15.1 如何在应用包清单中指定设备功能

问题

您需要指定 Windows 10 应用所需的不同设备的功能。

解决办法

使用应用包清单文件指定DeviceCapability元素和关联的子元素。

它是如何工作的

在 Visual Studio 2015 中打开您正在为 Windows 10 应用开发的项目。

从解决方案资源管理器中,找到Package.appmanifest文件。双击文件将其打开。单击功能选项卡。选择你的应用将使用的设备功能。这将在应用中添加功能列表(见图 15-1 )。

A978-1-4842-0719-2_15_Fig1_HTML.jpg

图 15-1。

Capabilities tab in app package.appmanifest file

您还可以在 XML 编辑器中打开 app package.appmanifest文件,并使用<Capabilities>元素下的<Capability>元素添加设备功能;例如:

<Capabilities>

<Capability Name="internetClient" />

<Capability Name="allJoyn" />

<Capability Name="codeGeneration" />

<Capability Name="internetClientServer" />

<uap:Capability Name="blockedChatMessages" />

<uap:Capability Name="chat" />

<uap:Capability Name="videosLibrary" />

<uap:Capability Name="phoneCall" />

<uap:Capability Name="removableStorage" />

<DeviceCapability Name="microphone" />

<DeviceCapability Name="webcam" />

</Capabilities>

在本例中,该应用启用了以下功能:聊天、视频库、电话和可移动数据存储,如 USB 驱动器、麦克风和网络摄像头。请注意,有一些功能,如网络摄像头,不能使用package.manifest可视界面指定。您必须使用代码文件来完成这项工作。

15.2 如何为 Windows 应用的蓝牙指定设备功能

问题

您需要在 Windows 10 应用中访问蓝牙设备。

解决办法

使用package.manifestDeviceCapability元素定义访问蓝牙设备的设备能力。这适用于蓝牙 Rfcomm 和 Gatt APIs。

它是如何工作的

Open your Windows Universal Windows app project in Visual Studio 2015.   From Solution Explorer, locate the Package.appmanifest file. Right-click and open the Package.appmanifest file in the XML editor.   Locate the <Capabilities> section. Add the following elements under <Capabilities>:  

<DeviceCapability Name="bluetooth.rfcomm">

<Device Id="any">

<Function Type="name:obexObjectPush"/>

<Function Type="name:serialPort"/>

<Function Type="name:genericFileTransfer"/>

</ Device>

</DeviceCapability>

在前面的代码中,<DeviceCapability>元素具有Name属性,该属性被指定为用于访问蓝牙 RFCOMM 设备的“bluetooth.rfcomm”。<Device>元素被设置为"any",以允许访问与<function>元素中指定的功能类型相匹配的任何设备。

<DeviceCapability>也可以用于为蓝牙 GATT 设备指定设备功能,如下面的代码片段所示:

<DeviceCapability Name="bluetooth.genericAttributeProfile">

<Device Id="any">

<Function Type="name:battery"/>

<Function Type="name:bloodPressure"/>

<Function Type=”serviceId:aaaaaaa”/>

</ Device>

</DeviceCapability>

在前面的代码中,蓝牙 GATT“任何”设备的 DeviceCapabilities 支持所提到的具有指定服务名称和服务 id 的功能。

15.3 如何找到可用于 UWP 应用的设备

问题

您想要获取连接到系统的设备列表-外部连接或可用于 UWP 应用。

解决办法

使用Windows.Devices.Enumeration.DevicePicker类来枚举应用可发现的设备。

它是如何工作的

在 Microsoft Visual Studio 2015 中使用 Windows 通用(空白应用)模板创建一个新项目。

从 Visual Studio 解决方案资源管理器中的项目打开 default.html 页。添加以下 HTML 标记以显示按钮和标签:

<body class="win-type-body">

<div>

<h2 id="sampleHeader" class="win-type-subheader">Description:</h2>

<div id="scenarioDescription">

Recipe to demo DevicePicker to allows users of your app to pick a device

</div>

</div>

<div id="scenarioContent">

<button id="showDevicePickerButton" >Show Device Picker</button>

</div>

</body>

在解决方案资源管理器中右键单击js文件夹。添加一个DevicePicker.js JavaScript 文件。在default.html中添加对这个js文件的引用。

<script src="/js/DevicePicker.js"></script>

在 Visual Studio 中打开devicePicker.js并添加以下脚本:

(function () {

"use strict";

var DevEnum = Windows.Devices.Enumeration;

var devicePicker = null;

var page = WinJS.UI.Pages.define("../default.html", {

ready: function (element, options) {

// Hook up button event handlers

document.getElementById("showDevicePickerButton").addEventListener("click", showDevicePicker, false);

}

});

在前面的代码中,我们声明了一个类型为Windows.Devices.Enumeration的变量。这个对象稍后将被用来创建DevicePicker对象。

当加载 DOM 时,page变量用于将其余的js脚本绑定到默认页面。

ready()函数中,我们将事件处理程序showDevicePicker绑定到showDevicePickerButton按钮。

添加下面的showDevicePicker()方法,这将使设备可用:

function showDevicePicker() {

var buttonRect;

devicePicker = new DevEnum.DevicePicker();

buttonRect = document.getElementById("showDevicePickerButton").getBoundingClientRect();

var rect = { x: buttonRect.left, y: buttonRect.top, width: buttonRect.width, height: buttonRect.height };

// Show the picker

devicePicker.show(rect);

}

})();

在单击showDevicePickerButton按钮时调用的showDevicePicker()事件处理程序中,我们创建了一个Windows.Devices.Enumeration.DevicePicker对象和一个矩形对象来显示选择器 UI 输出。

编译这个项目,并使用移动仿真器运行它,以获得所有设备的列表,如图 15-2 所示。

A978-1-4842-0719-2_15_Fig2_HTML.jpg

图 15-2。

Get enumeration of all devices available to app on system

15.4 如何创建音频流并基于纯文本输出语音

问题

你需要在你的应用中添加一个语音功能,让它能够阅读文本。

解决办法

使用Windows.Media.SpeechSynthesis.SpeechSynthesizer()在你的 UWP 应用中开发基于文本的音频/语音输出。

它是如何工作的

微软已经提供了预定义的声音,可以用来合成单一语言的语音。

在 Microsoft Visual Studio 2015 中使用 Windows 通用(空白应用)模板创建一个新项目。在项目package.appmanifest文件中,单击 Capabilities 选项卡,并选中 Microphone 和 Internet 复选框。这允许应用使用音频源。

在 Visual Studio 解决方案资源管理器中打开项目的default.html页面。在default.html<body>标签中添加以下 HTML 标记。

<body class="win-type-body">

<div id="scenarioView">

<div>

<h2 id="sampleHeader" class="win-type-subheader">>Convert text to speech.</h2>

</div>

<div id="scenarioContent">

<button id="btnSpeak" class="win-button">Speak</button>

<select id="voicesSelect" class="win-dropdown"></select>

<textarea id="textToSynthesize" style="width: 100%" name="textToSynthesize" class="win-textarea"> Hello World! This is an example of Windows 10 Universal Windows App Recipes</textarea>

<p id="errorTextArea"></p>

</div>

</div>

<div id="contentWrapper">

<div id="contentHost"></div>

<div id="statusBox">

Status:

<div id="statusMessage"></div>

</div>

</div>

</body>

当在调试模式下在移动仿真器中启动应用时,显示图 15-3 所示的内容。

A978-1-4842-0719-2_15_Fig3_HTML.jpg

图 15-3。

Text to speech GUI with drop-down list to select the language

如您所见,添加了四个主要控件:

  • 一个扬声器按钮
  • 允许用户选择可用语言的下拉列表
  • 包含预定义文本的文本框。该应用会将这些文本转换成音频
  • 语音播放和停止时显示消息的状态标签

在解决方案资源管理器中右击该项目,并选择“添加➤新 JavaScript 文件”。提供文件的名称。在本例中,我们将文件命名为 SpeechSynthesise。js。在文件中添加以下代码:

var page = WinJS.UI.Pages.define("../default.html", {

ready: function (element, options) {

try {

synthesizer = new Windows.Media.SpeechSynthesis.SpeechSynthesizer();

audio = new Audio();

var btnSpeak = document.getElementById("btnSpeak");

var voicesSelect = document.getElementById("voicesSelect");

btnSpeak.addEventListener("click", speakFn, false);

voicesSelect.addEventListener("click", setVoiceFunction, false);

var rcns = Windows.ApplicationModel.Resources.Core;

context = new rcns.ResourceContext();

context.languages = new Array(synthesizer.voice.language);

listbox_GetVoices();

audio_SetUp();

} catch (exception) {

if (exception.number == -2147467263) {// E_NOTIMPL

// If media player components aren't installed (for example, when using an N SKU of windows)

// this error may occur when instantiating the Audio object.

statusMessage.innerText = "Media Player components are not available.";

statusBox.style.backgroundColor = "red";

btnSpeak.disabled = true;

textToSynthesize.disabled = true;

}

}

},

unload: function (element, options) {

if (audio != null) {

audio.onpause = null;

audio.pause();

}

}

});

声明以下变量:

var synthesizer;

var audio;

// localization resources

var context;

var resourceMap;

在加载应用的设备上为default.html页面加载 DOM 时,会执行ready(函数。在这个函数中,创建一个类型为Windows.Media.SpeechSynthesis.SpeechSynthesizer()的本地synthesizer对象,它提供对微软设备上已安装的语音合成引擎的功能访问,并控制语音合成引擎(voice)。

第二个对象是audio,用于播放音频。然后我们为 Speak 按钮和voicesSelect下拉 HTML 控件关联事件监听器。

我们还创建了一个类型为Windows.ApplicationModel.Resources.Core的本地rcns对象。此对象用于枚举设备中所有可用的资源。后来,它被用来获取已安装的声音,并使用下拉控件显示它们。

在前面的代码中,我们还声明了在其他方法中使用的局部变量,这些方法被称为单击 Speak 按钮和voicesSelect下拉列表。请注意,如果设备中缺少媒体播放器组件,并且无法播放音频,我们还会捕获一个异常。如果出现异常,我们捕获它并在 HTML div对象中显示 StatusMessage 错误消息。

添加以下方法:

function audio_SetUp() {

audio.onplay = function () { // executes when the voice begins playing

statusMessage.innerText = "Playing";

};

audio.onpause = function () { // executes when the user presses the stop button

statusMessage.innerText = " Audio Completed";

btnSpeak.innerText = "Speak";

};

audio.onended = function () { // executes when the voice finishes playing

statusMessage.innerText = "Completed";

btnSpeak.innerText = "Speak";

voicesSelect.disabled = false;

};

}

audio_SetUp() method Sets up the voice element's events so the app UI updates based on the current state of voice playback.

接下来,添加以下方法:

function speakFn() {

var btnSpeak = document.getElementById("btnSpeak");

if (btnSpeak.innerText == "Stop") {

voicesSelect.disabled = false;

audio.pause();

return;

}

// Changes the button label. You could also just disable the button if you don't want any user control.

voicesSelect.disabled = true;

btnSpeak.innerText = "Stop";

statusBox.style.backgroundColor = "green";

// Creates a stream from the text. This will be played using an audio element.

synthesizer.synthesizeTextToStreamAsync(textToSynthesize.value).done(

function (markersStream) {

// Set the source and start playing the synthesized audio stream.

var blob = MSApp.createBlobFromRandomAccessStream(markersStream.ContentType, markersStream);

audio.src = URL.createObjectURL(blob, { oneTimeOnly: true });

markersStream.seek(0);

audio.play();

},

function (error) {

errorMessage(error.message);

});

}

speakFn()是用户点击应用上的发言/停止按钮时调用的主要方法。synthesizer.synthesizeTextToStreamAsync()方法用于将文本框中的文本转换成 Blob 流。然后,它通过音频播放该流。

接下来,添加下面的方法,允许用户从资源中选择不同的音频语音选项。

function setVoiceFunction() {

/// <summary>

/// This is called when the user selects a voice from the drop down.

/// </summary>

if (voicesSelect.selectedIndex !== -1) {

var allVoices = Windows.Media.SpeechSynthesis.SpeechSynthesizer.allVoices;

// Use the selected index to find the voice.

var selectedVoice = allVoices[voicesSelect.selectedIndex];

synthesizer.voice = selectedVoice;

// change the language of the sample text.

context.languages = new Array(synthesizer.voice.language);

}

}

在这个方法中,我们使用了Windows.Media.SpeechSynthesis.SpeechSynthesizer.allVoices()来获取allVoices对象中所有已安装的语音合成引擎(voices)。

接下来,添加下面的方法来从设备安装的声音中创建项目。这些声音随后显示在voicesSelect下拉控件中。

function listbox_GetVoices() {

/// <summary>

/// This creates items out of the system installed voices. The voices are then displayed in a listbox.

/// This allows the user to change the voice of the synthesizer in your app based on their preference.

/// </summary>

// Get the list of all of the voices installed on this machine.

var allVoices = Windows.Media.SpeechSynthesis.SpeechSynthesizer.allVoices;

// Get the currently selected voice.

var defaultVoice = Windows.Media.SpeechSynthesis.SpeechSynthesizer.defaultVoice;

var voicesSelect = document.getElementById("voicesSelect");

for (var voiceIndex = 0; voiceIndex < allVoices.size; voiceIndex++) {

var currVoice = allVoices[voiceIndex];

var option = document.createElement("option");

option.text = currVoice.displayName + " (" + currVoice.language + ")";

voicesSelect.add(option, null);

// Check to see if we're looking at the current voice and set it as selected in the listbox.

if (currVoice.id === defaultVoice.id) {

voicesSelect.selectedIndex = voiceIndex;

}

}

}

最后,如果出现任何错误消息,有一个通用的errorMessage()方法来显示errorTextArea对象上的错误。

function errorMessage(text) {

/// <summary>

/// Sets the specified text area with the error message details.

/// </summary>

var errorTextArea = document.getElementById("errorTextArea");

errorTextArea.innerText = text;

}

一旦创建完SpeechSynthesise.js文件,确保在default.html文件中添加一个引用。

<script src="/js/SpeechSynthesise.js"></script>

当你在 Windows 10 移动模拟器中运行应用时,应用会打开default.html文件。按“朗读”按钮以当前默认的声音播放声音。更新Status div中的值,如图 15-4 所示。

A978-1-4842-0719-2_15_Fig4_HTML.jpg

图 15-4。

Text to speech app

在这个菜谱中,您学习了如何使用Windows SpeechSynthesizer()类将文本转换成音频。请注意,您还可以用 SSML 语言指定文本,并将其传递给一个对象Windows.Media.SpeechSynthesis.SpeechSynthesizer(),以将指定的文本转换成音频。

15.5 如何为语音识别指定识别约束

问题

你需要创建一个允许语音识别的应用。

解决办法

使用Windows.Media.SpeechRecognition.SpeechRecognizer对象创建一个语音识别器,并使用Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint指定不同的语音识别约束。

UWP 应用中有三种可能的语音限制。

  • SpeechRecognitionTopicConstraint:基于预定义的语法,依赖互联网连接。
  • SpeechRecognitionListConstraint:基于预定义的单词和短语列表。
  • SpeechRecognitionGrammarFileConstraint:添加了一个语音识别语法规范(SRGS)文件,所有的约束都在这个 XML 文件中指定。

这个菜谱使用SpeechRecognitionListConstraint将语音转换成文本。

它是如何工作的

在 Microsoft Visual Studio 2015 中使用 Windows 通用(空白应用)模板创建一个新项目。在项目package.appmanifest文件中,单击 Capabilities 选项卡,并选中 Microphone 和 Internet 复选框。这允许应用使用音频源。

打开default.html文件,复制以下代码:

<body class="win-type-body">

<div id="scenarioView">

<div>

<h2 id="sampleHeader" class="win-type-subheader">Speech to Text</h2>

<div id="scenarioDescription">

<p>Speech recognition using a custom list-based grammar.</p>

</div>

</div>

<div id="scenarioContent">

<div>

<button id="btnSpeak" class="win-button">Speak</button>

</div>

<p id="errorTextArea"></p>

</div>

</div>

</body>

在解决方案资源管理器中右击该项目,并选择“添加➤新 JavaScript 文件”。提供文件的名称。在本例中,我们将其命名为 Speechrecognisation。js。

将以下代码添加到Speechrecognisation.js文件中:

(function () {

"use strict";

function GetControl() {

WinJS.UI.processAll().done(function () {

var btnSpeak = document.getElementById("btnSpeak");

btnSpeak.addEventListener("click", buttonSpeechRecognizerListConstraintClick, false);

var resultTextArea = document.getElementById(resultTextArea);

});

}

document.addEventListener("DOMContentLoaded", GetControl);

前面的代码向 btnSpeak 按钮添加了一个事件接收器。现在添加一个buttonSpeechRecognizerListConstraintClick函数,当用户单击用户首选项表单控件上的 Speak 按钮时触发该函数。

function buttonSpeechRecognizerListConstraintClick() {

// Create an instance of SpeechRecognizer.

var speechRecognizer =

new Windows.Media.SpeechRecognition.SpeechRecognizer();

// You could create this array dynamically.

var responses = ["Yes", "No", "Hello", "Hello World"];

// Add a web search grammar to the recognizer.

var listConstraint =

new Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint(

responses,

"YesOrNo");

speechRecognizer.uiOptions.audiblePrompt = "Say what you want to search for…";

speechRecognizer.uiOptions.exampleText = "Ex. 'Yes', 'No', 'Hello'";

speechRecognizer.constraints.append(listConstraint);

var resultTextArea = document.getElementById(resultTextArea);

// Compile the default dictation grammar.

speechRecognizer.compileConstraintsAsync().done(

// Success function.

function (result) {

// Start recognition.

speechRecognizer.recognizeWithUIAsync().done(

// Success function.

function (speechRecognitionResult) {

// Do something with the recognition result.

speechRecognizer.close();

},

// Error function.

function (err) {

if (typeof errorTextArea !== "undefined") {

errorTextArea.innerText = "Speech recognition failed.";

}

speechRecognizer.close();

});

},

// Error function.

function (err) {

if (typeof errorTextArea !== "undefined") {

errorTextArea.innerText = err;

}

speechRecognizer.close();

});

}

})();

前面的代码声明了一个名为speechRecognizer的变量。它被分配给Windows.Media.SpeechRecognition.SpeechRecognizer()类,表示语音识别器对象的容器。下一行有一个responses静态数组变量,用来存储识别出的语音约束值。

然后在类型为Windows.Media.SpeechRecognition.SpeechRecognitionListConstraint()的对象实例中引用它,该实例加载在responses数组中指定的所有值。

以下是语音识别器的用户界面设置。将SpeechRecognitionListConstraint listcontraint传递给speechRecognizer对象。

然后我们调用speechRecognizer.compileConstraintsAsync()方法来异步编译由constraints属性指定的所有约束。该方法执行提供了类型为SpeechRecognitionCompilationResult的输出,该输出是使用speechRecognitionResult成功函数捕获的。我们还捕获错误并使用errorTextArea元素显示它们。

一旦你完成了Speechrecognisation.js文件,确保你在default.html中添加了一个引用。

<script src="js/Speechrecognisation.js"></script>

就是这样。语音识别基于预定义的约束,在应用中可用。它可用于捕捉用户输入。

当您在 Windows Mobile 模拟器中运行该应用时,它看起来如图 15-5 所示。点按“开始”并说出具体的单词,例如“是”、“否”或“你好”语音识别器将对其进行验证。

A978-1-4842-0719-2_15_Fig5_HTML.jpg

图 15-5。

Speech recognition based on a custom list of words

15.6 如何在前台使用 Cortana 语音命令启动您的应用

问题

你想让用户能够使用 Cortana 语音命令在前台启动你的应用。

解决办法

使用语音命令定义(VCD)文件来定义语音命令,其中包含激活应用的命令。安装执行 app 时,VCD 文件安装在 Cortana 中。

用户可以说出 VCD 文件中指定的命令来启动应用。Cortana 在 Windows 语音平台和云托管的微软语音识别服务的帮助下识别用户语音命令。这两个服务都试图识别语音,Cortana 接收文本,并使用onactivated事件启动应用和应用中的语音命令。

它是如何工作的

在 Microsoft Visual Studio 2015 中使用 Windows 通用(空白应用)模板创建一个新项目。

在项目中添加新的视频命令定义文件CortanaVoiceCommands.xml。将以下 XML 代码添加到文件中:

<?xml version="1.0" encoding="utf-8" ?>

<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2T2】

<CommandSet xml:lang="en-gb" Name="CortanaVoiceCommandSet">

<AppName>Win10Recipes</AppName>

<Example> Show Win10 Recipes </Example>

<Command Name="showDevicesAvailableRecipes">

<Example>Show</Example>

<ListenFor RequireAppName="BeforeOrAfterPhrase">{command}</ListenFor>

<ListenFor RequireAppName="ExplicitlySpecified">Listening to command </ListenFor>

<Feedback> Recipes available in App </Feedback>

<Navigate/>

</Command>

<PhraseList Label="command">

<Item>Devices</Item>

<Item>Text to Speech</Item>

</PhraseList>

</CommandSet>

</VoiceCommands>

在这个视频命令定义文件中,有几个主要元素。元素定义了用于激活应用和执行命令的命令。元素还具有指定命令语言的属性xml:Lang。在这个例子中,我们使用的是英国英语。

<CommandPrefix>是我们应用的唯一名称。它被用作语音命令的前缀或后缀来激活应用。<Commmand>元素用于命令用户可以说什么。<ListenFor>元素指定了 Cortana 应该识别的文本。<Feedback>元素指定了 Cortana 在启动应用时所说的文本。<Navigate>元素表示语音命令是在前台启动应用。

如果要在后台通过语音命令启动 app,使用<VoiceCommandService>

创建 VCD 文件后,安装 VCD 文件指定的命令。为此,使用installCommandDefinitionsFromStorageFileAsync方法。

从解决方案资源管理器中打开 d efault.js。在这里,调用onactivated方法并添加以下代码:

//load vcd

var storageFile = Windows.Storage.StorageFile;

var wap = Windows.ApplicationModel.Package;

var voiceCommandManager = Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinitionManager;

wap.current.installedLocation.getFileAsync("CortanaVoiceCommands.xml")

.then(function (file) {

voiceCommandManager.installCommandDefinitionsFromStorageFileAsync(file);

});

var activationKind = args.detail.kind;

var activatedEventArgs = args.detail.detail;

在前面的代码中,我们使用了Windows.ApplicationModel.Package.current.installedLocation.getFileAsync方法来获取对 VCD 文件的引用。调用了installCommandDefinitionsFromStorageFileAsync方法来安装文件中指定的命令。现在,我们必须指定应用如何响应与 VCD 文件匹配的语音命令。为此,首先检查IActivatedEventArgs.Kind是否为VoiceCommand。在default.js中的标准代码后替换以下代码,以检查激活参数类型:

if (args.detail.kind === activation.ActivationKind.launch) {

if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {

// TODO: This application has been newly launched. Initialize your application here.

} else {

// TODO: This application was suspended and then terminated.

// To create a smooth user experience, restore application state here so that it looks like the app never stopped running.

}

args.setPromise(WinJS.UI.processAll());

}

else if (activationKind == Windows.ApplicationModel.Activation.ActivationKind.voiceCommand)

{

var speechRecognitionResult = activatedEventArgs[0].Result;

// Get the name of the voice command and the text spoken

var voiceCommandName = speechRecognitionResult.RulePath[0];

switch(voiceCommandName)

{

case "showDevicesAvailableRecipes":

var textSpoken = speechRecognitionResult.semanticInterpretation.properties[0];

var url = "Devices.html";

nav.history.backStack.push({ location: "/Devices.html" })

break;

default:

break;

}

}

};

app.oncheckpoint = function (args) {

// TODO: This application is about to be suspended. Save any state that needs to persist across suspensions here.

// You might use the WinJS.Application.sessionState object, which is automatically saved and restored across suspension.

// If you need to complete an asynchronous operation before your application is suspended, call args.setPromise().

};

app.start();

前面的代码检查了指定激活类型的Windows.ApplicationModel.Activation.ActivationKind值。检查ActivationKind是否为voiceCommand或其他方式。如果应用是使用语音命令启动的,那么您需要在speechRecognitionResult变量中获取用户所说的文本;要获取字符串,请使用activatedEventArgs

activatedEventArgs有一个名为Result的属性,它提供了SpeechRecognitionResult

要获取用户所说的文本,使用speechRecognitionResult.RulePath[0]并将其存储在voiceCommandName局部变量中。

使用此文本(voiceCommandName),您可以决定显示哪个应用页面。为此,请切换大小写,并将 voicecommandName 值与 VCD 文件中指定的命令名相匹配。在CortanaVoiceCommands.xml中,你指定命令名showDevicesAvailableRecipes。如果匹配,在devices.html中向用户显示应用页面。这样,应用就与 Cortana 集成在一起了。当用户使用语音命令启动应用时,您可以进一步增强以启动应用页面。

Note

您不能使用 Visual Studio 移动模拟器来测试这个配方,因为 Cortana 需要一个 Microsoft 帐户注册和登录过程,这在移动模拟器上不工作。相反,你需要在设备上安装应用,然后运行 Cortana 来测试应用在前台的启动。