Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Windows Phone: salvare una foto dal Web all'hub sul device (Visual Basic)

La piattaforma di sviluppo per Windows Phone mette a disposizione una serie di API per l'interazione con il Pictures Hub, che è poi il posto in cui vengono memorizzate le foto.

Una richiesta molto frequente è quella di poter salvare nel device foto da Internet, dato il loro indirizzo Web. Posto che ci siamo accertati di avere il permesso di poterlo fare , ricorriamo a una serie di strumenti. Innanzitutto usiamo la classe WebClient per eseguire il download asincrono della foto. Quindi spostiamo il suo contenuto fatto di byte in un file all'interno dell'isolated storage, per poi eseguire il salvataggio vero e proprio.

Per interagire in modo rapido con l'hub delle foto è conveniente utilizzare la classe MediaLibrary (che non fa solo questo), messa a disposizione dall'assembly Microsoft.Xna.Framework. Tale assembly, al quale dobbiamo necessariamente aggiungere un riferimento nel nostro progetto, è specifico per i giochi sviluppati con XNA ma si integra perfettamente con le app.

Il codice che ci permette di eseguire questa operazione non è affatto complicato, richiede solo un po' di dimestichezza con gli stream. Eccolo, con i commenti che facilitano la lettura:

'The following Imports directives are required
'Imports System.Windows.Resources
'Imports System.IO
'Imports Microsoft.Xna.Framework.Media
'Imports System.IO.IsolatedStorage
 
Private Sub SavePictureToHub(webAddress As Uri, pictureName As String)
    Dim client As New WebClient()
    AddHandler client.OpenReadCompleted, Sub(sender As Object, e As OpenReadCompletedEventArgs)
                                             'Get the result of the download operation as a stream
                                             Dim resInfo As New StreamResourceInfo(e.Result, Nothing)
                                             Dim reader As New StreamReader(resInfo.Stream)
 
                                             'Get a reference to the isolated storage
                                             Dim store = IsolatedStorageFile.GetUserStoreForApplication
 
                                             'Read the downloaded stream
                                             Dim contents As Byte()
                                             Using bReader As New BinaryReader(reader.BaseStream)
                                                 contents = bReader.ReadBytes(CInt(reader.BaseStream.Length))
                                             End Using
 
                                             'Move the downloaded stream to a temp file into the isolated storage
                                             Using fStream As IsolatedStorage.IsolatedStorageFileStream = store.CreateFile(pictureName)
                                                 fStream.Write(contents, 0, contents.Length)
                                             End Using
 
                                             'Save the picture to the Pictures hub (Saved pictures)
                                             Using rStream As New IsolatedStorageFileStream(pictureName, FileMode.Open, store)
                                                 Dim ml As New MediaLibrary
                                                 ml.SavePicture(pictureName, rStream)
                                             End Using
 
                                             reader.Close()
 
                                             'Remove the temp file from the isolated storage
                                             store.DeleteFile(pictureName)
                                         End Sub
 
    client.OpenReadAsync(webAddress)
End Sub

Per una comodità personale uso le statement lambda dove posso, chiaramente si poteva incapsulare il codice della sub 'nidificata' in un delegate separato. L'unica cosa di cui tener conto (oltre, come detto, ad avere il permesso di scaricare la foto) è che le immagini verranno salvate nell'album chiamato Foto Salvate.

Alessandro

Print | posted on giovedì 19 gennaio 2012 21:24 | Filed Under [ Visual Basic Silverlight e Windows Phone ]

Powered by:
Powered By Subtext Powered By ASP.NET