【发布时间】:2017-10-06 11:39:45
【问题描述】:
我有一个命令 Cortana 说出一个名字,但这只有在应用程序打开时才有效。如果我用关闭的应用程序发出命令,应用程序会打开但不会启动命令。我如何才能真正打开应用程序?
CortanaCommand.xml:
<CommandSet xml:lang="en-us" Name="ExampleAppCommandSet_en-us">
<CommandPrefix> Open name </CommandPrefix>
<Example> Find a name </Example>
<Command Name="FindName">
<Example> Find name </Example>
<ListenFor> Find name </ListenFor>
<ListenFor> Find name </ListenFor>
<Feedback> Find name </Feedback>
<Navigate/>
</Command>
App.xaml.cs(公共应用):
public App()
{
Microsoft.ApplicationInsights.WindowsAppInitializer.InitializeAsync(
Microsoft.ApplicationInsights.WindowsCollectors.Metadata |
Microsoft.ApplicationInsights.WindowsCollectors.Session);
this.InitializeComponent();
this.Suspending += OnSuspending;
}
App.xaml.cs (OnActivated):
protected override void OnActivated(IActivatedEventArgs e)
{
// Was the app activated by a voice command?
if (e.Kind != Windows.ApplicationModel.Activation.ActivationKind.VoiceCommand)
{
return;
}
var commandArgs = e as Windows.ApplicationModel.Activation.VoiceCommandActivatedEventArgs;
var speechRecognitionResult = commandArgs.Result;
string voiceCommandName = speechRecognitionResult.RulePath[0];
string textSpoken = speechRecognitionResult.Text;
Frame rootFrame = Window.Current.Content as Frame;
MainPage page = rootFrame.Content as MainPage;
if (page == null)
{
return;
}
switch (voiceCommandName)
{
case "FindName":
page.FindNameInList();
break;
default:
// There is no match for the voice command name.
break;
}
}
MainPage.xaml.cs:
private async void Page_Loaded(object sender, RoutedEventArgs e)
{
var storageFile =
await Windows.Storage.StorageFile.GetFileFromApplicationUriAsync(
new Uri("ms-appx:///CortanaCommand.xml"));
await Windows.ApplicationModel.VoiceCommands.VoiceCommandDefinitionManager
.InstallCommandDefinitionsFromStorageFileAsync(storageFile);
}
public async void FindNameInList()
{
MediaElement mediaElement = new MediaElement();
// The object for controlling the speech synthesis engine (voice).
var synth = new Windows.Media.SpeechSynthesis.SpeechSynthesizer();
// Generate the audio stream from plain text.
SpeechSynthesisStream stream = await synth.SynthesizeTextToStreamAsync("Your name, is, Jhon");
// Send the stream to the media object.
mediaElement.SetSource(stream, stream.ContentType);
mediaElement.Play();
}
提前致谢!
【问题讨论】:
-
所以这是 UWP 中没有的东西。最接近的方法是打开 cortana 应用,然后说“FindName”,它会正常工作