Browsed by
Month: December 2012

Attention au WriteableBitmap pour générer vos tuiles Windows Phone 8 !

Attention au WriteableBitmap pour générer vos tuiles Windows Phone 8 !

Quelques minutes avant de publier Fuse², je me suis rendu compte d’un bug assez étrange. Lorsque que sortais de l’application via le bouton Windows, je ne pouvais plus revenir dans l’application avec le bouton “back” du téléphone, voici ce que le téléphone m’affichait :

wp_ss_20121226_0001

Plutôt gênant !!

Pourquoi cela ?

En fait, le bug n’intervenait que lorsque j’avais une tuile sur l’écran d’accueil. Après investigation, il se trouve que cela provient de la fonction WriteableBitmap.Render qui, s’il est appelé après Application_Desactivated, empêche tout retour à l’application.

Reproduire le problème

Il est assez facile de reproduire ce soucis :

  • Créez une application windows phone 8
  • Ajoutez le code suivant dans Application_Desactivated
WriteableBitmap wb = new WriteableBitmap(336, 336);
BitmapImage image = new BitmapImage(new Uri("/Assets/AlignmentGrid.png", UriKind.Relative));
var im = new Image() { Source = image, Height = 336, Width = 336 };
wb.Render(im, null);
  • Lancez l’application
  • Appuyez sur le bouton windows
  • Appuyez sur le bouton “back”

L’explication

Comme beaucoup d’applications, je génère mes tuiles dynamiques en local en utilisant un  WriteableBitmap et j’appelle ma fonction de génération de tuiles dans Application_Desactivated et Application_Closing, deux évènements qui sont lancés lorsque l’on quitte l’application soit via le bouton Windows (ou un launcher), soit en fermant complètement l’application via le bouton “back”.

Tout ceci fonctionnait bien avec les applications Windows Phone 7, mais ce n’est plus le cas avec les applications Windows Phone 8 (précision : une application Windows Phone 7 tournant sur un Windows Phone 8 ne rencontre pas ce soucis).

Chose intéressante, l’image est bien généré ! C’est juste le retour à l’application qui est impossible, comme si WriteableBitmap.Render maintenait le thread UI et empêchait son retour.

Comment contourner ?

Pour contourner ce soucis, il faut se brancher un peu avant le Application_Desactivated comme par exemple sur l’évènement OnNavigatingFrom de chaque page. Cette solution pourrait fonctionner mais serait difficile à maintenir et assez contraignante.

On va donc se brancher encore un peu plus haut, au niveau de l’ApplicationFrame, pour cela dans App.xaml.cs

Ajoutez la ligne suivante dans InitializePhoneApplication :


RootFrame.Navigating += RootFrame_Navigating;

Puis ajoutez la fonction suivante :


void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e)
{
if(e.Uri.OriginalString=="app://external/")
{

//gestion de mes tuiles

}

}

 

Et voilà !!

Attention, votre code sera appelé à la fois pour la désactivation et la fermeture, il n’est malheureusement pas possible à ce niveau de différencier les deux. Toutefois, cela devrait avoir peu d’effet car en général, on met à jour ses tuiles dans ces deux évènements.

 

Bonnes fêtes !

Gérer le Windows-1252 sous Windows Phone

Gérer le Windows-1252 sous Windows Phone

Windows Phone supporte plusieurs charset : UTF-8, Unicode, iso-8859-1, etc… mais ironiquement, il ne supporte pas le Windows-1252 (ou CP1252) le charset créé par Microsoft et utilisé par Windows notamment.

Heureusement pour nous, le Windows-1252 est très proche de notre iso-8859-1 (ou Latin-1), nous allons donc utiliser ce dernier pour “supporter” le Windows-1252.

J’ai notamment rencontré ce soucis avec le site www.smartphonefrance.info sous Fuse, voici le workaround :

Read More Read More

Comment lancer une application depuis un tag NFC

Comment lancer une application depuis un tag NFC

Pour lancer une application depuis un tag NFC on peut par exemple :

  • Associer un protocole à son application : samplenfc: par exemple
  • définir un urimapper pour convertir la fausse uri vers les paramètres de l’application
  • écrire sur le tag NFC une donnée de type WindowsUri contenant le protocole de l’application

Toutefois, cette solution, bien qu’ingénieuse à ses points faibles :

  • pas forcément cross plateforme, l’extension de protocole n’étant pas supporté partout
  • n’importe quelle application peut utiliser le même protocole, votre application ne sera pas forcément celle qui se lancera, ceci est difficilement imaginable pour une campagne publicitaire par exemple.
  • Uniquement disponible pour les applications compilées avec le SDK 8.0.
  • Impossible de cette façon de lancer une application que l’on n’a pas nous même codé
  • L’application ne sera pas directement proposé au téléchargement si on ne l’a pas

Nous allons donc voir une autre solution en utilisant tout simplement le protocole adapté à notre besoin : LaunchApp.

Voici à quoi cela va ressembler quand on touchera le tag :

 

Read More Read More