2015-01-16 14 views
5

Ho un'app universale per Windows Phone 8.1 su cui sto lavorando per aggiungere il supporto Cortana di base a. Molti articoli su questo sono per Silverlight, ecc. - Sto trovando difficile trovare davvero buone informazioni a riguardo.invocazione cortana causa arresto anomalo all'avvio

Finora, ho attivato l'attivazione se l'app è già in esecuzione o sospesa. Tuttavia, se l'app è completamente chiusa, all'attivazione si blocca immediatamente. Ho provato ad usare Hockey e una semplice routine "LittleWatson" per catturare l'incidente, ma sembra che accada troppo presto per essere catturato. Ho visto alcuni riferimenti a fare una beta privata e cercare di ottenere il crash dump, ma finora non ho avuto fortuna.

Ecco ciò che il mio codice di attivazione assomiglia in 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); 
       } 
      } 
     } 
    } 

e qui è il mio assegno per il risultato comando:

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; 
    } 

Sono abbastanza sicuro di inserire messaggi ecc che fallisce molto prima che arrivi così lontano.

C'è probabilmente qualcosa di semplice che mi manca, ma non so che cosa ...

cosa sta causando il crollo così presto?

EDIT Una cosa che ho provato è usare la configurazione "debug senza avvio" per cercare di catturare l'eccezione. Quando faccio questo, l'app sembra bloccarsi per sempre connessa nel debugger nella schermata iniziale. Tuttavia, questo mi ha permesso di forzare una pausa. Si blocca in

global::Windows.UI.Xaml.Application.Start((p) => new App()); 

che come meglio posso dire, mi dice che l'app è appesa da qualche parte. Questa è l'unica linea nello stack di chiamate.

+0

Hai provato la memorizzazione del nome del comando vocale al posto del greggio [SpeechRecognitionResult] (http://msdn.microsoft.com/en-us/library/windows/apps/xaml/windows.media.speechrecognition. speechrecognitionreult.aspx) oggetto? Ho notato che si tratta di una risorsa controllata e temo che questo stia causando eccezioni di accesso quando lo si archivia in memoria. – lsuarez

+0

@lthibodeaux grazie per il tuo suggerimento! Ho cambiato il codice per passare solo la stringa di testo del comando senza modifiche. –

risposta

10

Copia un segmento del codice OnLaunched in OnActivated come nell'esempio seguente. OnLaunched non viene chiamato quando l'app è attivata e svolge un lavoro essenziale come l'attivazione della finestra.

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

questo era quasi esattamente quello di cui avevo bisogno, quindi grazie! Questo mi ha ucciso per molte, molte settimane! –