[UWP开发] Cortana启动应用
来源:互联网 发布:中企动力垃圾 网络何 编辑:程序博客网 时间:2024/05/27 20:15
适用于win10应用开发。
使用Cortana可以快速启动应用,甚至可以根据说出的指令,快速到达应用内的某个页面或启动某项功能。如通过Cortana说出,“微博 搜索计算机”就可以声控打开并搜索有关计算机的微博内容。
在win10手机中,启动Cortana,点击左上角菜单,帮助。可以查看Cortana支持应用列表。
点击后可以查看详细的指令列表,以微信为例。
可以看出部分指令是完整的语句(如打开话费充值),而部分指令包含可选择部分(如找{某人})
- 编写VCD文件
供Cortana使用的指令,定义在vcd文件中。vcd文件是xml格式文件。
在VS中新建并添加xml格式文件,文件名无要求,后缀为.xml。
第一行为:
<?xml version="1.0" encoding="utf-8"?>
xml根节点为VoiceCommands节点,里面指出vcd文件版本。其中包含数个CommandSet节点,每个CommandSet中定义一种语言的指令列表,每种程序支持的语言要单独定义。
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2"> <CommandSet xml:lang="zh-cn" Name="2048CommandSet_zh-cn"> <CommandPrefix> 2048 </CommandPrefix> <Example> 快乐游戏 </Example> </CommandSet></VoiceCommands>
xml:lang=”zh-cn” 表示语言为简体中文。Name是标记,在程序中引用和动态修改vcd文件时有用。
CommandSet以下有CommandPrefix节点,意义是应用名称的简写或别名,用户说出CommandPrefix中的名称,即可在Cortana中调起该应用。
Example节点,按照官方文档说是给一个可用功能的示例。但现在多用于展示应用的特性与口号。
CommandPrefix与Example中的内容,如文章开头的第一幅图,信息在其中显示。可以看出微信的CommandPrefix是MicroMsg,Example是微信,是一个生活方式。
在最新的1.2版vcd中,CommandPrefix可以换为AppName,AppName是新的用法,表示的意义相同。
详细的口语指令,每一条指令包含在一个Command节点下。Command节点为CommandSet的子节点。
一个Command节点的例子如下所示:
<Command Name="Start"> <Example> 新游戏 </Example> <ListenFor> [开始][启动]新游戏 </ListenFor> <Feedback> 正在开始新游戏 </Feedback> <Navigate/></Command>
其中Name=”Start”表示指令名称,在应用后台代码中进行处理。
Example,在文章开头的第二幅图中的指令列表中显示,告诉用户可以怎样说。
ListenFor节点可以有多个,当Cortana听到ListenFor中的文字内容后,就会执行本条指令。中括号包含的部分表示可选部分。在上例中,当听到“新游戏”或“开始新游戏“或”启动新游戏“甚至是”开始启动新游戏“时,都会执行这一条指令,但是”启动开始新游戏“不会被执行,因为顺序不对。
FeedBack表示当用户说了本条指令后,Cortana在执行指令时,对用户的反馈。在上例中,当用户说出“新游戏”后,Cortana执行指令,同时告诉用户“正在开始新游戏”。
Navigate表示执行指令后,打开应用跳转到的Page名称,如“MainPage.xaml”。也可以不写,但需要在App.cs文件中处理相应的事件。
对于那些有可选择部分的指令,给一个例子:
<Command Name="Load"> <Example> 读取存档 1 </Example> <ListenFor> [读取][使用]存档 {SaveNum} </ListenFor> <Feedback> 使用存档 {SaveNum} 进行游戏 </Feedback> <Navigate/></Command><PhraseList Label="SaveNum"> <Item>1</Item> <Item>2</Item> <Item>3</Item> <Item>4</Item> <Item>5</Item></PhraseList>
其中ListenFor中{SaveNum}表示使用label {SaveNum}中的Item项的内容进行替换。此处只有说存档1~5,Cortana才会相应,当说出存档6时,Cortana不会响应。如Item项的内容不确定,如想搜索某个地点,此处直接用{*},表示此处可以用任意语句匹配。
其中的PhraseList,可以替换为PhraseTopic,用来表示指令目的和类别范围,如下所示:
<PhraseTopic Label="SearchTerms" Scenario="Search"> <Subject> City/State </Subject> </PhraseTopic>
Scenario用来更精确表示语句应用的场景,使得语句能够被更精确识别。Scenario可以为:”Natural Language”, “Search”, “Short Message”, “Dictation”, “Commands”, “Form Filling”。
Subjectfont 可以有多个,用来表示该语句的主题,是一个范围,实际操作时会在该范围内进行匹配。可以为 “Addresses”, “City/State”, “Person Names”, “Movies”, “Music”, “Phone Number”。
- 处理语音事件
首先需要在代码中应用vcd文件,在App.cs的OnLaunched方法中添加如下语句。
try{ var storageFile = await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Command.xml")); await Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinitionManager.InstallCommandDefinitionsFromStorageFileAsync(storageFile);}catch (Exception ex){ System.Diagnostics.Debug.WriteLine("Installing Voice Commands Failed: " + ex.ToString());}
当启动一次应用后,就会将vcd文件进行应用,之后就可以使用Cortana快速启动应用。
通过Cortana启动的应用,不会调用OnLaunched方法,而是使用OnActivated方法。需要在程序中重写此方法。
protected async override void OnActivated(IActivatedEventArgs e){ //如果是被语音指令激活 if (e.Kind == Windows.ApplicationModel.Activation.ActivationKind.VoiceCommand) { var commandArgs = e as Windows.ApplicationModel.Activation.VoiceCommandActivatedEventArgs; Windows.Media.SpeechRecognition.SpeechRecognitionResult speechRecognitionResult = commandArgs.Result; //获取语音指令的Name string voiceCommandName = speechRecognitionResult.RulePath[0]; if (voiceCommandName == "Load") { // 获取匹配到的可选部分,标签为SaveNum的指令语句内容 string item = speechRecognitionResult.SemanticInterpretation.Properties["SaveNum"][0]; //后续指令处理 } }}
需要注意的是,如果vcd文件中某条指令的Navigate项没有写明跳转的页面,那么会调用App.cs中的OnActivated方法,在其中进行处理。而此时OnLaunched方法是不会被执行的,其中的一些应用初始化操作,需要自行复制到OnActivated方法中。
测试环境Windows 10 UWP
- [UWP开发] Cortana启动应用
- Win10/UWP开发—使用Cortana语音指令启动前台App
- 【UWP开发】uwp应用安装失败
- Win10/UWP开发—使用Cortana语音与App后台Service交互
- 【UWP开发】如何通过unity发布win10 uwp应用
- 【UWP通用应用开发】控件、应用栏
- 1.2 UWP 应用开发准备篇
- 【UWP通用应用开发】应用布局、基本导航
- Cortana
- 【UWP通用应用开发】开发准备、部分新特性
- 【UWP开发】如何将win10 UWP应用安装部署到xbox one
- 【UWP开发】如何判断UWP应用在PC还是在xbox上运行?
- 【UWP应用开发实战】第一弹 使用剪切板
- 【UWP通用应用开发】集合控件与数据绑定
- 适用于UWP应用开发的开源React Native插件
- win10 uwp应用开发(JS)——wifi扫描连接
- 使用Visual Studio 2017开发Windows UWP应用
- 集成Cortana到你的应用中
- java佩恩沃星球打怪掉血实现
- 包的设计
- 关于This Handler class should be static or leaks might occur的解决办法
- 2015腾讯校招后台开发一面二面三面面试分享
- STM32学习第三天----有个USART的发送数据的问题没有解决
- [UWP开发] Cortana启动应用
- velocity模板的语法简要汇总
- 2015.11.26 接下来学习方向的一些想法——尝试学习后台开发
- 南大软院大神养成计划--第十一天JS进行中
- Unique Paths
- 杭电1491Octorber 21st(数学)
- js局部变量 全局变量
- MPMoviePlayerController 电影播放器—IOS开发
- maven的pom.xml解析