Dans un de mes derniers articles, je vous expliquais comment créer une vibration. J’avais réalisé ce tutoriel suite à une application que je réalisais. (http://blog.devillu.com/?p=569) En quelques mots, dans cette application j’ai un bouton ON/OFF et lorsque le bouton ON est pressé , le téléphone vibre en continue jusqu’à ce qu’on ré-appui sur le bouton pour le faire passer à OFF. Aujourd’hui Microsoft a refusé mon application ! Pourquoi ? Quand on recevait un appel pendant que la vibration était en cours, celle-ci ne s’arrêtait pas ! J’avais donc le code erreur suivant : 5.3 Phone Functionality 5.3.1 Requirements The application must not delay or prevent the user from initiating a phone call, answering an incoming phone call, or ending a phone call. Alors que dans mon code j’avais fait :
/// /// Called when a page is no longer the active page in a frame. /// ///An object that contains the event data. protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedFrom(e); Vibro.Stop(); }
Je me suis donc penché sur le problème. Après quelques tests et débogage, je me suis rendu compte que lorsqu’on reçoit un appel, on ne passe pas dans la méthode OnNavigatedFrom ! Un appel c’est en fait un gros popup qui vient se glisser sur votre application mais qui ne la fait pas quitter. J’ai donc cherché une solution et je l’ai trouvé, je vais donc vous la partager. Pour corriger ce problème, dans le constructeur votre App.xaml.cs on va donc s’inscrire à l’évènement Obscured et Unobscured de l’objet RootFrame (Lien vers la Doc MSDN). Ces évènement servent à savoir si quelque chose recouvre ou ne recouvre plus notre Frame (Dans mon cas, le popup de l’appel) . On aura donc le constructeur de App.xaml.cscomme ceci :
/// /// Initializes a new instance of the class. /// public App() { UnhandledException += Application_UnhandledException; InitializeComponent(); InitializePhoneApplication(); if (System.Diagnostics.Debugger.IsAttached) { Application.Current.Host.Settings.EnableFrameRateCounter = true; PhoneApplicationService.Current.UserIdleDetectionMode = IdleDetectionMode.Disabled; } RootFrame.Obscured += new EventHandler(RootFrame_Obscured); RootFrame.Unobscured += new EventHandler(RootFrame_Unobscured); }
Et évidemment on définit alors nos 2 évènements:
void RootFrame_Unobscured(object sender, EventArgs e) { Vibro.Start(); } void RootFrame_Obscured(object sender, ObscuredEventArgs e) { Vibro.Stop(); }
Et c’est tout … Maintenant on a plus de problèmes au niveau des appels et la vibration se coupe bien dès qu’un appel est reçu et se réactive quand on coupe l’appel.
No Comments