2015-01-16 17 views
5

Mam aplikację Universal Phone systemu Windows Phone 8.1, nad którą pracuję, dodając obsługę Cortany. Wiele artykułów na ten temat dotyczy Silverlight itp. - Trudno mi znaleźć naprawdę dobre informacje na ten temat.wywołanie cortana powoduje awarię podczas uruchamiania

Do tej pory aktywuję działanie, jeśli aplikacja jest już uruchomiona lub zawieszona. Jednakże, jeśli aplikacja jest całkowicie zakończona, to po aktywacji natychmiast ulega awarii. Próbowałem użyć hokeja i prostej procedury "LittleWatson", aby złapać wypadek, ale zdaje się, że nastąpi to zbyt wcześnie, by zostać złapanym. Widziałem kilka odniesień do robienia prywatnej wersji beta i próbowałem dostać zrzut awaryjny, ale do tej pory nie miałem z tym szczęścia.

Oto co mój kod aktywacyjny wygląda w app.xaml.cs:

protected override void OnActivated(IActivatedEventArgs args) { 
     base.OnActivated(args); 
     ReceivedSpeechRecognitionResult = null; 
     if (args.Kind == ActivationKind.VoiceCommand) { 
      var commandArgs = args as VoiceCommandActivatedEventArgs; 
      if (commandArgs != null) { 
       ReceivedSpeechRecognitionResult = commandArgs.Result; 
       var rootFrame = Window.Current.Content as Frame; 
       if (rootFrame != null) { 
        rootFrame.Navigate(typeof(CheckCredentials), null); 
       } 
      } 
     } 
    } 

i tu jest mój czek na wynik polecenia:

private async Task CheckForVoiceCommands() { 
     await Task.Delay(1); // not sure why I need this 
     var speechRecognitionResult = ((App)Application.Current).ReceivedSpeechRecognitionResult; 
     if (speechRecognitionResult == null) { 
      return; 
     } 
     var voiceCommandName = speechRecognitionResult.RulePath[0]; 

     switch (voiceCommandName) { 
      // omitted 
     } 

     ((App)Application.Current).ReceivedSpeechRecognitionResult = null; 
    } 

jestem całkiem pewny, z włożeniem wiadomości itd., Które go kończy się niepowodzeniem na długo przed tym, zanim dojdzie tak daleko.

Jest prawdopodobne coś łatwo mi brakuje, ale nie wiem co ...

Co jest przyczyną awarii tak wcześnie?

EDYCJA Jedną z rzeczy, którą próbowałem, jest użycie konfiguracji "debugowanie bez uruchamiania", aby spróbować złapać wyjątek. Kiedy to zrobię, aplikacja będzie zawieszać się na zawsze w debugerze na ekranie powitalnym. Jednak to pozwoliło mi wymusić przerwę. Zawieszanie w nim zawiesza się, co najlepiej mogę powiedzieć, po prostu mówi mi, że aplikacja gdzieś się zawiesza. To jedyna linia w stosie wywołań.

+0

Czy próbowali przechowywania nazwy poleceń głosowych zamiast surowego [SpeechRecognitionResult] (http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.media.speechrecognition. speechrecognitionresult.aspx) obiekt? Zauważyłem, że jest to zasób skonfigurowany i podejrzewam, że powoduje to wyjątki dostępu podczas przechowywania w pamięci. – lsuarez

+0

@Ithibodeaux dziękuję za sugestię! Zmieniłem kod tak, aby przekazywał tylko tekst polecenia bez żadnych zmian. –

Odpowiedz

10

Skopiuj fragment kodu OnLaunched do OnActivated, jak w poniższym przykładzie. OnLaunched nie jest wywoływany, gdy aplikacja jest aktywowana i wykonuje kilka istotnych czynności, takich jak aktywacja okna.

protected override void OnActivated(IActivatedEventArgs args) 
{ 
    // When a Voice Command activates the app, this method is going to 
    // be called and OnLaunched is not. Because of that we need similar 
    // code to the code we have in OnLaunched 
    Frame rootFrame = Window.Current.Content as Frame; 
  
    if (rootFrame == null) 
    { 
     rootFrame = new Frame(); 
     rootFrame.CacheSize = 1; 
     Window.Current.Content = rootFrame; 
     rootFrame.Navigate(typeof(MainPage)); 
    } 
  
    Window.Current.Activate(); 
  
    // For VoiceCommand activations, the activation Kind is ActivationKind.VoiceCommand 
    if(args.Kind == ActivationKind.VoiceCommand) 
    { 
     // since we know this is the kind, a cast will work fine 
     VoiceCommandActivatedEventArgs vcArgs = (VoiceCommandActivatedEventArgs)args; 
  
     // The NavigationTarget retrieved here is the value of the Target attribute in the 
     // Voice Command Definition xml Navigate node 
     string target = vcArgs.Result.SemanticInterpretation.Properties["NavigationTarget"][0]; 
+0

to było prawie dokładnie to, czego potrzebowałem, więc dziękuję! To zabija mnie przez wiele, wiele tygodni! –

Powiązane problemy