[WP8.1] Comment utiliser le FileOpenPicker sous WP 8.1

aug 12, 2014 7:45 pm by Julien

Suite au TechNek de Rudy sur la communauté WP j'ai eu pour defi d'ecrire un article sur l'utilisation du FileOpenPicker sous WP8.1 dans les 48h sous peine de devoir lui payer un restau.

Crevard comme je suis, j'ai choisis l'article ca, me coutera moins cher :D

Historique

Sous WP 8.0, nous n'avons pas de FilePicker, en revanche on avait une alternative sous la forme de XXXTask (PhotoChooserTask) qui permettait de pouvoir récupérer une photo dans le Hub Photos.

C'etait assez simple à utiliser, une classe a instancier, l'abonnement a un event et une methode (.Show() ) a appelé et c'etait fini. On recevait en parametre l'image selectionnée.

Oui mais ca c'etait avant ...

Les pickers sous 8.1

Avec Windows Phone 8.1, on retrouve les API que l'on avait sous WinRT, c'est a dire le FileOpenPicker pour récuperer un fichier. On est plus contraint à un seul format de fichier ni a une localisation précise, on peut meme selectionner plusieurs fichier ! C'est quand meme cool ca non ? :D

Dans les faits, on y perd quand même quelque fonctionnalité, notamment le crop que l'on pouvait activer avec le PhotoChooserTask (ou alors je ne l'ai pas trouvé :/)
Avec les apps Silverlight on peut toujours utilsier les Tasks si besoin par contre avec les Store Apps c'est NADA :)

Bref tout ca pour dire que ca aurait pu être plus simple si les pickers s'utilisaient de la meme façon que sous Windows 8...
Tout les pickers sous WP 8.1 ont une méthode supplémentaire dans les pickers qui se terminent par XXXAndContinue() et qui permet de donner la main au systeme afin d'y effectuer une opération (SavePicker, OpenPicker, WebAuthenticationBroker etc...)

Pourquoi avoir utiliser ce systeme au lieu d'un simple await comme on le faisait sous Win8 ? Je dirai que la gestion mémoire des applications est differente et que surtout on peut avoir des devices avec 512 de RAM. Concretement lorsqu'on appelle notre méthode, notre application passe dans l'état desactivé car elle n'est plus au premier plan mais elle peut aussi se retrouver dans un état Terminated ! C'est pour cela qu'il faut sauvegarder l'état de l'application et le restaurer au besoin. 

Oui mais le picker on l'utilise comment :((((

Je ne vais pas rentrer dans le code pur car un sample MS montre bien comment cela fonctionne mais plutot expliqué le fonctionnement et le cheminement des appels pour en arriver a nos fins !
Pour le sample c'est de ce coté : http://msdn.microsoft.com/en-us/library/windows/apps/xaml/dn631755.aspx

Pour le fonctionnement :

 

 

1 - On appelle notre Methode XXXAndContinue();

var picker = new FileOpenPicker();
picker.SuggestedStartLocation = PickerLocationId.HomeGroup;
picker.FileTypeFilter.Add(".jpg");
picker.ContinuationData["Operation"] = "UpdatePicture";
picker.PickSingleFileAndContinue();

On doit definir le format souhaité du fichier retourné et on peut definir le dossier de départ. A savoir que le systeme est assez intelligent pour faire certain choix. Par exemple il choisir automatiquement le dossier Pictures si vous avez mis un filtre ".jpg"
Le ContinuationData sert à identifier les appels vers les pickers et a passer des valeurs supplementaires quand notre application reprendra la main (par exemple l'id d'une instance)

2 - Notre application est deactivated (il faut penser au scenario ou notre app passe en terminated) et laisse la main au systeme afin qu'il puisse afficher le picker voulu !

3 - Notre joli picker s'affiche, on interagit avec, on choisit un element et on redonne la main au systeme.

4 - Le systeme va relancer notre application en lui fournissant en parametre la valeur de retour du picker (un ou des fichiers dans le cas d'un FilePicker, le resultat de l'authentification dans le cas du WebAuthenticationBroker)

Lorsque notre application reprend la main, elle passe dans le Activated du App.xaml.cs avec en parametre un objet qui contient les fichiers selectionnés.
On obtient ça : 

protected async override void OnActivated(IActivatedEventArgs e)
{
   var args = e as FileOpenPickerContinuationEventArgs;
   if ((args.ContinuationData["Operation"] as string) == "UpdatePicture" &&
                args.Files.Count > 0)
   {
                StorageFile file = args.Files[0];
                IRandomAccessStream fileStream = await       file.OpenAsync(Windows.Storage.FileAccessMode.Read);
                
   }
}

Le code est simplifié pour comprendre plus facilement :) 

Dans mon sample, j'ai le continuation manager qui regroupe la gestion des differents arguments liés aux differents types de pickers et un lot d'interface qu'une classe doit implementer pour traiter une opération lié a un picker spécifique !

Sous Windows Phone Silverlight 8.1 il y'a aussi une petite différence comparé aux Store Apps, c'est que le App.xaml.cs est un peu différent au niveaux des evenements. Pour traiter les evenements liés aux Picker il faut s'abonner a :

PhoneApplicationService.Current.ContractActivated += Application_ContractActivated;

 

La gestion est plus complexe que sous WP8.0 mais en revanche elle est plus souple dans son usage notamment au niveaux des types de fichiers retournes, du nombre de fichier, de sa localisation etc ...

 Je vous mets en lien les 2 sample pour SL et Store Apps. Il faut bien regarder le ContinuationManager et le App.Xaml.Cs ;)

TechNek.rar (540.92 kb)

Add comment

  Country flag

biuquote
  • Comment
  • Preview
Loading