Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1900, 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

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

Utilizzare SkyDrive in Windows Phone 8 con Visual Basic

SkyDrive è ormai entrato a far parte della nostra quotidianità di utilizzatori di tecnologie Microsoft, a ben diritto fra l'altro offrendoci 7 GB di spazio di archiviazione gratis per ogni account di posta Microsoft (Outlook.com) che abbiamo, mentre i più fortunati che usavano Hotmail da tanti anni (tipo il sottoscritto ) ne hanno addirittura a disposizione 25.

In questo post vediamo come caricare e scaricare un file su e da SkyDrive in un'applicazione per Windows Phone 8, scenario sempre più richiesto.

La prima cosa da fare è scaricare e installare il Live SDK, che contiene delle specifiche API per poter interagire da codice managed con SkyDrive. In realtà la comodità è che possiamo utilizzare NuGet per scaricare l'SDK direttamente nel nostro progetto. Quindi, col progetto aperto in Visual Studio 2012, tasto destro -> Mange NuGet Packages:

Il passaggio successivo consiste nell'ottenere un numero identificativo per l'applicazione. Per fare questo si va nella sezione My Apps del Live Connect Developer Center. Dovrete creare una nuova applicazione e recuperare il Client ID come in figura:

Nella pagina che vogliamo utilizzare per la gestione dei file su SkyDrive, nello XAML dovremo aggiungere il seguente namespace XML:

 xmlns:my="clr-namespace:Microsoft.Live.Controls;assembly=Microsoft.Live.Controls"

L'SDK mette a disposizione un comodissimo pulsante per l'accesso a SkyDrive, necessario per l'autenticazione dell'utente prima di poter compiere qualunque operazione. Ecco un esempio:

    <my:SignInButton 
    Scopes="wl.signin wl.skydrive_update"
    Branding="Skydrive" ClientId="YOUR_ID_GOES_HERE" 
    TextType="SignIn" 
    SessionChanged="SignInButton_OnSessionChanged"
    VerticalAlignment="Top"/>

La proprietà ClientId deve contenere l'identificativo omonimo recuperabile nella pagina in cui avete creato l'app. Il Branding può essere il classico SkyDrive o quello di Microsoft account. Molto importante è la proprietà Scopes. In questo caso stiamo usando i valori wl.signin e wl.skydrive_update che sono sufficienti per accedere e modificare file, ma ce ne sono altri che vanno specificati a seconda delle operazioni che si intende compiere. L'elenco completo è disponibile nella documentazione.

L'evento OnSessionChanged si verifica quando il Runtime si rende conto che l'accesso è avvenuto. Qui non c'è bisogno di gestire a mano il Click, è sufficiente gestire il cambiamento di stato. Il seguente codice mostra un esempio:

    'Richiede Imports Microsoft.Live
    Dim client As LiveConnectClient
    Dim fileID As String
    Private Sub SignInButton_OnSessionChanged(sender As Object, e As Microsoft.Live.Controls.LiveConnectSessionChangedEventArgs)         'Se rileva lo stato di connesso e autenticato         If e.Status = LiveConnectSessionStatus.Connected Then             'Crea una nuova istanza del client di connessione             'Session rappresenta la sessione attuale             client = New LiveConnectClient(e.Session)         Else             'Non connesso. Utile per disabilitare controlli e o risorse         End If     End Sub

Ipotizzando di avere un pulsante che si chiama BackupButton e che l'utente tocca per salvare un file su SkyDrive, l'upload si esegue in modo molto semplice:

    Private Async Sub BackupButton_Click(sender As Object, e As RoutedEventArgsHandles BackupButton.Click
        Using storage = IsolatedStorageFile.GetUserStoreForApplication()
            Dim stream = storage.OpenFile("MioFile.txt"FileMode.Open)
            Dim result = Await client.UploadAsync("me/skydrive""MioFile.bak", stream, OverwriteOption.Overwrite)
            If result.Result IsNot Nothing Then
                Me.fileID = result.Result("id").ToString
                MessageBox.Show("Backup eseguito con successo!")
                Exit Sub
            End If
        End Using
    End Sub

Si istanzia uno stream che punta al file locale, che chiaramente risiede nell'isolated storage. Poi, ricorrendo al pattern Async/Await, si invoca il metodo UploadAsync della classe LiveConnectClient. L'espressione "me/skydrive" rappresenta la directory radice di SkyDrive. L'oggetto Result restituito è un IDictionary(Of String, Object) e contiene un identificativo per ogni file caricato e il relativo file. Quindi memorizziamo l'ID del file caricato perché tornerà utile in fase di ripristino.

Nota bene: per semplicità didattica gestiamo un solo file all'interno della directory radice. Creare e gestire directory è un'attività più complessa, ben descritta comunque nella documentazione.

L'operazione di download è più complessa. Infatti, richiede l'iterazione della cartella di interesse al fine di trovare il file contraddistinto dal nome/id che ci serve. Una volta determinata l'esistenza dell'id, e quindi del file, il file stesso viene scaricato e copiato come stream nell'isolated storage. Vi ricordo che, per forza di cose, un'app per Windows Phone memorizza dati solo nel suo spazio dedicato. Il seguente codice ipotizza l'esistenza di un pulsante chiamato RestoreButton e i commenti al suo interno rendono semplice la sua comprensione:

    Private Async Sub RestoreButton_Click(sender As Object, e As RoutedEventArgsHandles RestoreButton.Click
        'Ottengo l'elenco dei file nella cartella radice
        Dim result As LiveOperationResult = Await client.GetAsync("me/skydrive/files")
        'Dietro le scene è un Dictionary, converto la proprietà Data in una 
        'collezione di Object
        Dim items As List(Of Object) = TryCast(result.Result("data"), List(Of Object))
 
        Dim id As String = String.Empty
 
        'Ciclo la lista...
        For Each item As Object In items
            Dim file As IDictionary(Of StringObject) = TryCast(item, IDictionary(Of StringObject))
            If file IsNot Nothing Then
                'finchè non trovo il file di mio interesse
                If file("name").ToString() = "MioFile.bak" Then
                    'e ne memorizzo l'ID
                    id = file("id").ToString()
                End If
            End If
 
        Next
 
        'Se l'ID è vuoto, il file non c'è
        If id = String.Empty Then
            MessageBox.Show("Nessun file di backup trovato.")
            Exit Sub
        Else
            'Ho trovato il file, sono educato e chiedo conferma prima di sovrascrivere
            Dim confirmation = MessageBox.Show("Il ripristino da SkyDrive cancellerà l'elenco dei veicoli sul telefono. Sei sicuro di voler procedere?",
                                               ""MessageBoxButton.OKCancel)
            If confirmation = MessageBoxResult.Cancel Then
                Exit Sub
            Else
                'Scarico il file in base al suo ID
                Dim downloadResult As LiveDownloadOperationResult =
                    Await client.DownloadAsync(String.Format("{0}/content", id))
 
                'Ottengo un riferimento allo stream
                Dim stream = downloadResult.Stream
 
                'Ottengo un riferimento all'Isolated Storage...
                Using storage = IsolatedStorageFile.GetUserStoreForApplication
                    'apro il file in scrittura...
                    Using fileToSave = storage.OpenFile("MioFile.txt"FileMode.Create, FileAccess.ReadWrite)
                        'copio lo stream nel nuovo file
                        Await stream.CopyToAsync(fileToSave)
                        Await stream.FlushAsync
                        stream.Close()
                    End Using
                End Using
                MessageBox.Show("Operazione completata")
 
            End If
        End If
    End Sub

Prima di testare la vostra app, c'è una cosa fondamentale da fare. Nel manifest dell'applicazione, dovete impostare le capabilities Networking e WebBrowser:

Il motivo è semplice, SkyDrive necessita della connessione a Internet (Networking) e utilizza il componente WebBrowser per farvi digitare username e password.

Nota: quando toccherete il pulsante di Sign in, l'app richiederà dapprima il consenso per accedere a SkyDrive. Solo a consenso dato, potrete accedere allo spazio ed effettuare le operazioni di interesse.

Di possibilità con SkyDrive ce ne sono tantissime, ad esempio si può interagire con le informazioni del profilo utente e molto altro. Ad ogni modo, con questo primo assaggio avete cominciato a capire come funziona il discorso, pratica molto richiesta nelle nuove app.

Alessandro

Print | posted on lunedì 17 giugno 2013 22:06 | Filed Under [ Silverlight e Windows Phone ]

Powered by:
Powered By Subtext Powered By ASP.NET