首页 > 解决方案 > 在我的应用程序中使用 Cortana

问题描述

我在使用 Cortana 控制我的应用程序时遇到了一些问题。我可以使用前台命令控制我的应用程序。但我不能使用后台命令来控制我的应用程序。我的 Package.appxmainfest

我的 VCD 文件

    <?xml version="1.0" encoding="utf-8" ?>
<VoiceCommands xmlns="http://schemas.microsoft.com/voicecommands/1.2">

  <CommandSet xml:lang="zh-cn" Name="set">
    <AppName>随机抽号器&lt;/AppName>
  <Example>抽号 或 随机抽号</Example>

    <Command Name="Generate">
      <Example>随机抽号</Example>
      <ListenFor>[随机]抽号</ListenFor>
      <Feedback>正在为您抽取号码……&lt;/Feedback>
      <VoiceCommandService Target="RNGCortanaService"/>
    </Command>

    <Command Name="In-AppGenerate">
      <Example>随机抽号</Example>
      <ListenFor>[在]应用内[随机]抽号</ListenFor>
      <Feedback>正在为您抽取号码……&lt;/Feedback>
      <Navigate/>
    </Command>
  </CommandSet>
</VoiceCommands>

我的后台服务

namespace RandomNumberGenerationCortanaService
{
    public sealed class RNGCortanaService : IBackgroundTask
    {
        BackgroundTaskDeferral serviceDeferral;
        VoiceCommandServiceConnection voiceServiceConnection;
        ResourceMap cortanaResourceMap;
        ResourceContext cortanaContext;

        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            serviceDeferral = taskInstance.GetDeferral();

            taskInstance.Canceled += OnTaskCanceled;

            var triggerDetails = taskInstance.TriggerDetails as AppServiceTriggerDetails;

            if (triggerDetails != null && triggerDetails.Name == "RNGCortanaService")
            {
                try
                {
                    voiceServiceConnection =
                        VoiceCommandServiceConnection.FromAppServiceTriggerDetails(
                            triggerDetails);

                    voiceServiceConnection.VoiceCommandCompleted += OnVoiceCommandCompleted;

                    VoiceCommand voiceCommand = await voiceServiceConnection.GetVoiceCommandAsync();

                    // perform the appropriate command.
                    switch (voiceCommand.CommandName)
                    {
                        case "Generate":
                            await Generate();
                            break;
                        default:
                            break;
                    }
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine("Handling Voice Command failed " + ex.ToString());
                }
            }
        }

        private void OnTaskCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
        {
            System.Diagnostics.Debug.WriteLine("任务取消");
            if (this.serviceDeferral != null)
            {
                //Complete the service deferral
                this.serviceDeferral.Complete();
            }
        }

        private void OnVoiceCommandCompleted(VoiceCommandServiceConnection sender, VoiceCommandCompletedEventArgs args)
        {
            if (this.serviceDeferral != null)
            {
                this.serviceDeferral.Complete();
            }
        }

        private async Task Generate()
        {
            StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
            StorageFile sampleFile = await storageFolder.GetFileAsync("settings.txt");
            string text = await Windows.Storage.FileIO.ReadTextAsync(sampleFile);
            var settings = text.Split(',');
            bool convert = true;
            convert = int.TryParse(settings[0], out int qs);
            convert = int.TryParse(settings[1], out int zz);
            convert = int.TryParse(settings[2], out int n);
            int[] results = new int[n];
            //根据起始号和终止号设置数组,长度为zz-qs+1,将0与起始号对齐
            int[] numbers = new int[zz - qs + 1];
            int i = 1; //i表示正在生成的随机数的序号
            while (i <= n)
            {
                //产生[0,zz-qs]的随机数
                var a = new Random(Guid.NewGuid().GetHashCode()).Next(0, zz - qs + 1);
                if (numbers[a] == 0)
                {
                    //将0与起始号对齐
                    numbers[a] = 1; results[i - 1] = a + qs; i++;
                }
            }
            Array.Sort(results);
            var msgback = new VoiceCommandUserMessage(); var msgRepeat = new VoiceCommandUserMessage();
            var spokenMessage = "抽号结果为:";
            foreach (int aresult in results)
            {
                spokenMessage = spokenMessage + aresult.ToString() + "号";
            }
            msgback.DisplayMessage = msgback.SpokenMessage = spokenMessage;
            msgRepeat.DisplayMessage = msgRepeat.SpokenMessage = spokenMessage;
            var response = VoiceCommandResponse.CreateResponseForPrompt(msgback, msgRepeat);
            await voiceServiceConnection.ReportSuccessAsync(response);
        }

    }
}

我在使用后台命令后看到了这一点。 在此处输入图像描述

这意味着“有一些问题,请稍后再试”

我想知道如何解决这个问题并使用后台命令来正确控制我的应用程序。

标签: c#uwpcortana

解决方案


推荐阅读