有时候,用户并不希望启动应用程序,而是直接在Cortana面板中与应用程序完成交互,要实现该方案,可以将VCD(语音指令定义)文件与App Servicde进行关联。App Service是一种特殊的后台任务,允许调用方在不启动目标应用程序的情况下与目标应用程序进行通信。将语音指令与App Service关联,使得Cortana面板可以直接与应用程序后台进行通信,因而不需要显示启动应用程序。
当Cortana成功识别语音指令后,会调用关联的App Servcie,进而执行对应的后台任务。在后台任务的Run方法中,可以通过TriggerDatails属性获得一个AppServicedTriggerDetails实例,再从这个AppServiceTriggerDetails实例创建一个VoiceCommandServiceConnection对象,应用程序后台与Cortana的各种交互都可以通过该对象来完成。例如,要向Cortana面板报告后台操作成功完成,可以可以调用ReportSucessAsync方法;如果操作执行失败,可以调用ReportFailureAsync方法向Cortana面板反馈一条错误信息。
当调用VoiceCommandServiceConnection类的公共方法向Cortana反馈操作结果时,需要一个VoiceCommandReponse对象,它负责封装响应的内容(包括文本,图像列表等)。该类没有公开可供调用的构造函数,要获得它的实例对象必须调用其公开的静态方法。
VoiceCommandUserMessage类用于包装文本消息,DisplayMessage属性所设置的字符串将显示在Cortana面板上,而SpokenMessage属性所指定的字符串是Cortana要朗读的内容,两个属性的内容可以相同,也可以不相同。
如果用户说出的语言指令无法明确控制应用程序的行为,可以考虑向Cortana面板显示一些选项,让用户从中选择一项来完成惭怍。比如,用户发出指令"播放我收藏的电影",由于用户在应用程序中收藏了多部电影,应用程序不能确定要播放哪一部电影,此时,可以向Cortana面板返回一个列表,列表中包含用户收藏的电影,让用户从中选择一部进行播放。若要向Cortana返回一个可选列表,可以使用VoiceCommandContentTitle类,每一个VoiceCommandContentTitle实例则代表一个选项。该类所展示的选项既可以是纯文本信息,也可以呈现图文信息(图块与文本),这取决于ContentTitleType属性的设置。
接下来,将通过两个示例来演示如何实现Cortana与应用程序后台交互。
在第一个示例中,用户可以对Contana说出"删除文件"指令,应用程序收到指令后,会要求Cortana询问用户是否决定要删除,然后根据用户的回应来执行文件,示例的实现步骤如下:
- 新建UWP项目
- 向解决方案添加一个Windows运行时组件(Windows Runtime Component)项目
- 实现后台任务类,具体代码如下:
public sealed class DelFileAppsvc:IBackgroundTask
{
private BackgroundTaskDeferral taskDeferal = null;
public async void Run(IBackgroundTaskInstance taskInstance)
{
taskDeferal = taskInstance.GetDeferral();
taskInstance.Canceled += OnCancel;
AppServiceTriggerDetails details = taskInstance.TriggerDetails as AppServiceTriggerDetails;
//先判断执行的App Service是否为预期的目标
if (details.Name == "app-svc-1")
{
//产生VoiceCommandServiceConnection实例
VoiceCommandServiceConnection connection = VoiceCommandServiceConnection.FromAppServiceTriggerDetails(details);
if (connection != null)
{
VoiceCommand command = await connection.GetVoiceCommandAsync();
if (command.CommandName == "del")
{
connection.VoiceCommandCompleted += CommandCompleted;
//反馈给Cortana,询问用户是否同意执行
VoiceCommandUserMessage message = new VoiceCommandUserMessage();
message.DisplayMessage = "确定要删除文件?";
message.SpokenMessage = "你真的要删除文件吗?";
VoiceCommand