Cortana后台任务在移动设备上崩溃但在桌面上运行完美

时间:2017-08-24 13:24:23

标签: c# uwp cortana

过去几天一直在关注这个问题,我没有接近解决方案。下面的代码基于https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/CortanaVoiceCommand处的CortanaVoiceCommand示例,代码在桌面上完美运行,但后台任务每次都在移动设备上崩溃。

在OnTaskCanceled中,BackgroundTaskCancellationReason始终报告为 SystemPolicy ,但我没有找到解决方案。

感谢任何人的建议。

using System;
using System.Collections;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading.Tasks;
using Windows.ApplicationModel.AppService;
using Windows.ApplicationModel.Background;
using Windows.ApplicationModel.VoiceCommands;

namespace TramTimesVoice
{
    public sealed class VoiceCommandService : IBackgroundTask
    {
        private BackgroundTaskDeferral backgroundTaskDeferral;
        private IEnumerable services;
        private Service service;
        private Stop stop;
        private VoiceCommandServiceConnection voiceCommandServiceConnection;

        public async void Run(IBackgroundTaskInstance taskInstance)
        {
            backgroundTaskDeferral = taskInstance.GetDeferral();
            taskInstance.Canceled += OnTaskCanceled;

            AppServiceTriggerDetails triggerDetails = taskInstance.TriggerDetails as AppServiceTriggerDetails;

            if (triggerDetails != null && triggerDetails.Name == "VoiceCommandService")
            {
                try
                {
                    voiceCommandServiceConnection = VoiceCommandServiceConnection.FromAppServiceTriggerDetails(triggerDetails);
                    voiceCommandServiceConnection.VoiceCommandCompleted += OnVoiceCommandCompleted;

                    VoiceCommand voiceCommand = await voiceCommandServiceConnection.GetVoiceCommandAsync();

                    if (voiceCommand.CommandName == "getServices")
                    {
                        await SendCompletionMessageForServices(voiceCommand.Properties["stop"][0]);
                    }
                    else
                    {
                        LaunchAppInForeground();
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("Handling Voice Command Failed: " + ex.ToString());
                }
            }
        }

        private async void LaunchAppInForeground()
        {
            VoiceCommandUserMessage userMessage = new VoiceCommandUserMessage();
            userMessage.SpokenMessage = "Launching Tram Times";

            VoiceCommandResponse response = VoiceCommandResponse.CreateResponse(userMessage);
            response.AppLaunchArgument = "";

            await voiceCommandServiceConnection.RequestAppLaunchAsync(response);
        }

        private void OnTaskCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
        {
            if (backgroundTaskDeferral != null)
            {
                backgroundTaskDeferral.Complete();
            }
        }

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

        private async Task SendCompletionMessageForServices(String input)
        {
            await ShowProgressScreen("Working On It");

            IEnumerable stops = new Stops().Get();

            foreach (Stop item in stops)
            {
                if (input == item.Voice)
                {
                    stop = new Stop()
                    {
                        Code = item.Code,
                        Name = item.Name,
                        Latitude = item.Latitude,
                        Longitude = item.Longitude,
                        ApiCodes = item.ApiCodes,
                        City = item.City,
                        Lines = item.Lines,
                        Voice = item.Voice
                    };

                    break;
                }
            }

            if (stop.City == "Blackpool")
            {
                services = await new Blackpool().Get(stop.ApiCodes);
            }
            else if (stop.City == "Edinburgh")
            {
                services = await new Edinburgh().Get(stop.ApiCodes);
            }
            else if (stop.City == "London")
            {
                services = await new London().Get(stop.ApiCodes);
            }
            else if (stop.City == "Manchester")
            {
                services = await new Manchester().Get(stop.ApiCodes);
            }
            else if (stop.City == "Midland")
            {
                services = await new Midland().Get(stop.ApiCodes);
            }
            else if (stop.City == "Nottingham")
            {
                services = await new Nottingham().Get(stop.ApiCodes);
            }
            else if (stop.City == "Sheffield")
            {
                services = await new Sheffield().Get(stop.ApiCodes);
            }

            ObservableCollection<Service> data = new ObservableCollection<Service>();
            foreach (Service item in services)
            {
                if (item.DestinationScheduled != null)
                {
                    service = new Service()
                    {
                        Destination = item.Destination,
                        DestinationRealtime = item.DestinationRealtime,
                        DestinationRealtimeFull = item.DestinationRealtimeFull,
                        DestinationScheduled = item.DestinationScheduled,
                        DestinationScheduledFull = item.DestinationScheduledFull
                    };
                    data.Add(service);
                }
                else
                {
                    service = new Service()
                    {
                        Destination = item.Destination,
                        DestinationRealtime = item.DestinationRealtime,
                        DestinationRealtimeFull = item.DestinationRealtimeFull,
                        DestinationScheduled = item.DestinationRealtime,
                        DestinationScheduledFull = item.DestinationRealtimeFull
                    };
                    data.Add(service);
                }
            }
            data = new ObservableCollection<Service>(data.OrderBy(service => service.DestinationScheduledFull).ThenBy(service => service.Destination));

            VoiceCommandUserMessage userMessage = new VoiceCommandUserMessage();
            userMessage.DisplayMessage = "I Found These Services";
            userMessage.SpokenMessage = "I found these services from " + stop.Voice + ". ";

            Collection<VoiceCommandContentTile> tiles = new Collection<VoiceCommandContentTile>();

            VoiceCommandContentTile tile = new VoiceCommandContentTile();
            tile.AppLaunchArgument = stop.Name;
            tile.ContentTileType = VoiceCommandContentTileType.TitleWithText;
            tile.Title = stop.Name;

            if (data.Count > 0)
            {
                if (data[0].DestinationRealtime != null)
                {
                    tile.TextLine1 = data[0].DestinationRealtime + " " + data[0].Destination;
                    userMessage.SpokenMessage += data[0].DestinationRealtime + " to " + data[0].Destination + ". ";
                }
                else
                {
                    tile.TextLine1 = data[0].DestinationScheduled + " " + data[0].Destination;
                    userMessage.SpokenMessage += data[0].DestinationScheduled + " to " + data[0].Destination + ". ";
                }
            }

            if (data.Count > 1)
            {
                if (data[1].DestinationRealtime != null)
                {
                    tile.TextLine2 = data[1].DestinationRealtime + " " + data[1].Destination;
                    userMessage.SpokenMessage += data[1].DestinationRealtime + " to " + data[1].Destination + ". ";
                }
                else
                {
                    tile.TextLine2 = data[1].DestinationScheduled + " " + data[1].Destination;
                    userMessage.SpokenMessage += data[1].DestinationScheduled + " to " + data[1].Destination + ". ";
                }
            }

            if (data.Count > 2)
            {
                if (data[2].DestinationRealtime != null)
                {
                    tile.TextLine3 = data[2].DestinationRealtime + " " + data[2].Destination;
                    userMessage.SpokenMessage += data[2].DestinationRealtime + " to " + data[2].Destination + ". ";
                }
                else
                {
                    tile.TextLine3 = data[2].DestinationScheduled + " " + data[2].Destination;
                    userMessage.SpokenMessage += data[2].DestinationScheduled + " to " + data[2].Destination + ". ";
                }
            }

            tiles.Add(tile);

            VoiceCommandResponse response = VoiceCommandResponse.CreateResponse(userMessage, tiles);
            response.AppLaunchArgument = "";

            await voiceCommandServiceConnection.ReportSuccessAsync(response);
        }

        private async Task ShowProgressScreen(String message)
        {
            var userProgressMessage = new VoiceCommandUserMessage();
            userProgressMessage.DisplayMessage = message;
            userProgressMessage.SpokenMessage = message;

            VoiceCommandResponse response = VoiceCommandResponse.CreateResponse(userProgressMessage);

            await voiceCommandServiceConnection.ReportProgressAsync(response);
        }
    }
}

0 个答案:

没有答案
相关问题