locked
Windows Phone 8.1 Télécharger et enregistrer une image dans l'Isolated Storage, avant de l'attribuer à un objet. RRS feed

  • Discussion générale

  • Bonjour à tous,

    Pour consulter de façon hors ligne mon quotidien local, j'aimerai en télécharger le contenu avant de monter dans le train...

    D'où ma question, comment télécharger et enregistrer une image dans l'isolated storage ?
    J'ai essayé divers méthodes et suis arrivé à cela :

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net.Http;
    using System.Text;
    using System.Threading.Tasks;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Media.Imaging;
    
    namespace La_Montagne.Models
    {
        class Article
        {
            public String Titre { get; set; }
            public DateTime Date = new DateTime();
            public String Description { get; set; }
            public String ContenuTitre { get; set; }
            public String UriImage { get; set; }
            public Image Image { get; set; }
            public String Url { get; set; }
    
            public static int CompareByDate(Article x, Article y)
            {
                return x.Date.CompareTo(y.Date);
            }
            public Article()
            {
                this.Titre = "Titre";
            }
    
            public async Task getimage()
            {
                HttpClient client = new HttpClient();
                if (this.UriImage != null)
                {
                    var localFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;
                    var fileimage = await localFolder.CreateFileAsync(this.ContenuTitre.ToString() + ".jpeg", Windows.Storage.CreationCollisionOption.ReplaceExisting);
                    var writeFileStream = await fileimage.OpenStreamForWriteAsync();
                    writeFileStream = await client.GetStreamAsync(new Uri(this.UriImage));
                    Windows.Storage.Streams.IRandomAccessStream readFileStream = (Windows.Storage.Streams.IRandomAccessStream)await fileimage.OpenStreamForReadAsync();
                    BitmapImage imagesrc = new BitmapImage();
                    imagesrc.SetSource(readFileStream);
                    this.Image.Source = imagesrc;
                }
    
            }
    
        }
    }
    

    Le tout compile, mais à l'execution j'ai un soucis, un peu comme ci dès que le premier "await" se terminait, la fonction retournait.

    J'ai un peu de mal avec les concepts de l'asynchrone ;).

    Merci !

    • Type modifié Aurel Bera lundi 5 mai 2014 07:48 disc
    dimanche 27 avril 2014 19:51

Toutes les réponses

  •  
    Bonjour

    Essayez d’utiliser try/catch pour capturer une éventuelle exception :
     try-catch (référence C#)  (voir Exceptions dans les méthodes Async!!!).
    Quand même, vous avez tous les permissions nécessaires pour écrire sur IsolatedStorage ?

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    lundi 28 avril 2014 10:28
  • L'exception est la suivante, mais ce n'est pas le try catch qui la récupère, elle apparait au niveau de la fonction directement.


    A first chance exception of type 'System.NullReferenceException' occurred in La Montagne.exe
    Object reference not set to an instance of an object.
    The thread 0xe14 has exited with code 259 (0x103).
    The thread 0xe38 has exited with code 259 (0x103).
    The thread 0xe0c has exited with code 259 (0x103).

    J'ai récupéré cette exception dans le debug avec un WriteLine.

    J'ai vérifié les capabilities, et il semblerai que l'erreur persiste avec le "removable storage" actif.


    lundi 28 avril 2014 17:08
  • Vous n’utilisez pas correctement le Try/Catch. Essayez de les utiliser.

    Vérifiez aussi si le nom est correcte (this.ContenuTitre.ToString() ne contiens pas des caractères qui ne sont pas acceptés , essayez même avec une valeur en dur!)  

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 29 avril 2014 07:11
  • J'ai la même exception qui sort de mon catch (qui écrit dans mes lignes débug), je ne peux pas faire les manipulations de suite, je vous tiens informé dès ce soir.

    Concernant le titre, celui ci est conforme, j'arrive à afficher les textes etc, le problème vient uniquement des images, j'essaierai ce soir de remplacer les espaces dans celui ci par des Underscore.

    J'utilise juste l'URL stocké ici :
    public String UriImage { get; set; }
    Et celui ci est correct car j'affiche aussi le RSS parsé via l'output, et j'accède bien à l'image par le lien parsé (via une fonction d'une autre classe).

    Pour le try catch, je l'ai implémenté comme ceci :

           public async Task getimage()
            {
                HttpClient client = new HttpClient();
                if (this.UriImage != null)
                {
    try
    {
                    var localFolder = Windows.Storage.ApplicationData.Current.RoamingFolder;
                    var fileimage = await localFolder.CreateFileAsync(this.ContenuTitre.ToString() + ".jpeg", Windows.Storage.CreationCollisionOption.ReplaceExisting);
                    var writeFileStream = await fileimage.OpenStreamForWriteAsync();
                    writeFileStream = await client.GetStreamAsync(new Uri(this.UriImage));
                    Windows.Storage.Streams.IRandomAccessStream readFileStream = (Windows.Storage.Streams.IRandomAccessStream)await fileimage.OpenStreamForReadAsync();
                    BitmapImage imagesrc = new BitmapImage();
                    imagesrc.SetSource(readFileStream);
                    this.Image.Source = imagesrc;
                }
    }
    catch (Exception e)
    {
    Debug.WriteLine(e.Message);
    }
    
            }



    mardi 29 avril 2014 07:34
  • On peut avoir un souci de concurrence (si la même image est utilisée plusieurs fois)!
    Voir aussi ce thread :

     

    Can't save data to StorageFile while app is being deactivated 

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 29 avril 2014 07:49