Windows Phone: avviare funzionalità del device con i launchers
a cura di Alessandro Del Sole (requisiti: conoscenza di XAML)

Introduzione
Se avete un telefono con Windows Phone sapete che ci sono alcune importanti funzionalità a disposizione come l'app per le telefonate, il client per la gestione delle email, l'invio degli sms, le mappe di Bing, il lettore multimediale, Internet Explorer e molte altre.
Quando si creano applicazioni per dispositivi mobili è sovente necessario accedere a funzionalità come quelle menzionate; mentre in altri sistemi operativi (incluso il "vecchio" Windows Mobile) attivare determinate funzionalità a volte richiede molte linee di codice, in Windows Phone tutto questo è estremamente semplificato grazie alla presenza dei c.d. launchers.
I launcher sono rappresentati da classi messe a disposizione dal namespace Microsoft.Phone.Tasks e ognuna di esse rappresenta l'accesso a una delle funzionalità del dispositivo. Ad esempio, la classe BingMapsTask permette di accedere da codice alle mappe di Bing impostando anche un indirizzo da cercare.
L'elenco completo dei launcher è disponibile in questa pagina MSDN con relative spiegazioni, ad ogni buon conto li riepiloghiamo come segue:

BingMapsDirectionsTask permette di attivare le mappe di Bing e di ottenere automaticamente le indicazioni stradali per le coordinate specificate
BingMapsTask permette di attivare le mappe di Bing e di cercare l'indirizzo specificato
ConnectionSettingsTask consente di accedere alle impostazioni delle connessioni di rete
EmailComposeTask permette di attivare il client di posta elettronica specificando indirizzi dei destinatari e corpo dell'email
MarketPlaceDetailsTask consente di aprire il Market Place puntando alla pagina dedicata all'applicazione specificata tramite il suo ID
MarketPlaceHubTask consente di aprire il Market Place o per le app o per la musica
MarketPlaceReviewTask consente di aprire il Market Place puntando alla pagina delle recensioni per l'app specificata tramite ID
MarketPlaceSearchTask consente di aprire la pagina di ricerca nel Market Place
MediaPlayerLauncher permette di attivare il lettore multimediale sull'indirizzo specificato
PhoneCallTask consente di attivare la funzionalità telefono specificando un numero da chiamare e il nome da visualizzare
SearchTask cerca sul Web i termini specificati attraverso la funzionalità di ricerca integrata
ShareLinkTask consente di condividere sui social network collegati il link desiderato
ShareStatusTask consente di condividere un messaggio personale sui social network collegati
SmsComposeTask attiva la funzionalità SMS preimpostando numero e corpo del messaggio
WebBrowserTask permette di aprire Internet Explorer puntando all'indirizzo specificato

Ciascun launcher ha un metodo Show, che va invocato dopo aver assegnato le proprietà di interesse. Inoltre, il nome di ogni launcher termina con il suffisso Task proprio a ricordare il namespace da cui sono esposti (eccezion fatta per il MediaPlayerLauncher che è l'unico il cui nome termina in modo diverso).

In questo articolo faremo una panoramica sull'uso dei launcher più comuni. Per quanto riguarda i vari launcher relativi al Market Place, per praticità ne esamineremo solo uno poichè l'utilizzo degli altri sarà decisamente similare e la pagina MSDN precedentemente indicata fornisce i relativi dettagli. Il codice a corredo dell'articolo è disponibile in area Download di Visual Basic Tips & Tricks.

Il grande vantaggio derivante dall'utilizzo dei task è che non c'è alcuna necessità di implementare dei controlli utente o delle pagine apposite per sfogliare determinati contenuti. Per esempio, non ha alcun senso implementare un controllo utente che definisca un MediaElement per creare un riproduttore multimediale dal momento che è possibile sfruttare il Media Player integrato nel dispositivo (a meno, ovviamente, di specifiche esigenze).

Preparazione del progetto di esempio
Il progetto dimostrativo viene creato sfruttando il modello chiamato Windows Phone Application in Visual Studio 2010.
L'interfaccia grafica è assai banale ed è costituita da un elenco di pulsanti, ognuno dei quali andrà ad attivare uno specifico launcher. Detti pulsanti sono contenuti in uno StackPanel, a sua volta incluso in uno ScrollViewer. Quest'ultimo consentirà di scorrere con il dito sul dispositivo (o col mouse sull'emulatore) l'elenco di tutti i pulsanti.
Ciò premesso, nel file di codice XAML relativo alla pagina principale del progetto eliminiamo il contenitore Grid chiamato ContentPanel ed aggiunto di default da Visual Studio, sostituendolo con il seguente codice:

  <ScrollViewer x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <StackPanel>
      <Button Width="250" Margin="5" Name="IEButton"
               Click="IEButton_Click">Internet Explorer</Button>
      <Button Width="250" Margin="5" Name="MPButton"
               Click="MPButton_Click">Media Player</Button>
      <Button Width="250" Margin="5" Name="BingButton"
               Click="BingButton_Click">Bing Maps</Button>
      <Button Width="250" Margin="5" Name="BingDirectionsButton"
               Click="BingDirectionsButton_Click">Bing Directions</Button>
      <Button Width="250" Margin="5" Name="ConnectionButton"
               Click="ConnectionButton_Click">Connection</Button>
      <Button Width="250" Margin="5" Name="EmailButton"
               Click="EmailButton_Click">Email</Button>
      <Button Width="250" Margin="5" Name="CallButton"
               Click="CallButton_Click">Phone call</Button>
      <Button Width="250" Margin="5" Name="SearchButton"
               Click="SearchButton_Click">Search</Button>
      <Button Width="250" Margin="5" Name="SmsButton"
               Click="SmsButton_Click">SMS</Button>
      <Button Width="250" Margin="5" Name="StatusButton"
               Click="StatusButton_Click">Share Status</Button>
      <Button Width="250" Margin="5" Name="LinkButton"
               Click="LinkButton_Click">Share Link</Button>
      <Button Width="250" Margin="5" Name="MarketButton"
               Click="MarketButton_Click">Hub</Button>
    </StackPanel>
  </ScrollViewer>

Per ciascun pulsante deve essere definito un gestore di evento Click, all'interno del quale verrà scritto il codice che avvia il relativo launcher.

Avvio dei launcher
Cominciamo col descrivere i launcher esaminando il più semplice, ossia il WebBrowserTask che permette di attivare Internet Explorer. Ecco il codice:

  Private Sub IEButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim browserTask As New WebBrowserTask
    browserTask.Uri = New Uri("http://www.microsoft.com", UriKind.Absolute)
    browserTask.Show()
  End Sub

La peculiarità di questo launcher è l'assegnazione della sua proprietà Uri con un oggetto di tipo System.Uri che punti all'indirizzo Web specificato. Ecco il risultato nell'emulatore:

Il launcher successivo è quello che attiva il Media Player ed è chiamato MediaPlayerLauncher:

  Private Sub MPButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim mediaTask As New MediaPlayerLauncher
    mediaTask.Media = New Uri("http://www.tuosito.com/tuovideo.wmv", UriKind.Absolute)
    mediaTask.Show()
  End Sub

E' molto simile al precedente, nel senso che anche in questo caso si utilizza un oggetto System.Uri ma la proprietà da assegnare si chiama Media. Si noti che questo launcher è utilizzabile per video streaming, ma ogni video deve essere referenziato sotto forma di Uri. Vista la specificità degli indirizzi assegnabili, non viene mostrato uno screen shot.
Il successivo launcher è il BingMapsTask che attiva le mappe di Bing. Ecco il codice:

  Private Sub BingButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim bingTask As New BingMapsTask
    bingTask.SearchTerm = "Roma, Italy, via del Corso"
    bingTask.Show()
  End Sub

Come vedete è sufficiente assegnare la proprietà SearchTerm con l'indirizzo da cercare, per poi invocare il metodo Show che attiverà la mappa direttamente sull'indirizzo specificato:

Simile a questo è il BingMapsDirectionsTask, che però richiede la specifica di due posizioni Start ed End. Se Start non viene specificato, la posizione attuale rilevata tramite GPS viene utilizzata per default. Ecco un esempio:

  Private Sub BingDirectionsButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim bingDirections As New BingMapsDirectionsTask
    Dim colosseo As New LabeledMapLocation("Colosseo", Nothing)
    bingDirections.End = colosseo
    bingDirections.Show()
  End Sub

Le proprietà Start ed End vanno assegnate con istanze della classe LabeledMapLocation, il cui costruttore riceve un termine di ricerca come primo argomento e le coordinate in geolocation come secondo argomento. Quest'ultimo può essere passato come Nothing in modo che solo il termine di ricerca specificato nel primo argomento venga utilizzato.
Il launcher successivo è quello relativo alle connessioni di rete. Consideriamo il seguente esempio:

  Private Sub ConnectionButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim connectionSettingsTask As ConnectionSettingsTask = New ConnectionSettingsTask()
    connectionSettingsTask.ConnectionSettingsType = ConnectionSettingsType.WiFi
    connectionSettingsTask.Show()
  End Sub

Questo produrrà, come risultato, l'output della seguente figura:

L'enumerazione ConnectionSettingsType stabilisce quale connessione vada gestita; valori supportati sono AirPlaneMode, BlueTooth, Cellular e WiFi.
Il launcher successivo è forse uno dei più importanti poichè attiva una funzionalità di grande interesse, ossia l'invio di email. Il codice è simile al seguente:

  Private Sub EmailButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim emailTask As New EmailComposeTask
    emailTask.To = "diego.cattaruzza@visual-basic.it"
    emailTask.Subject = "Messaggio da Mango"
    emailTask.Cc = "antonio.catucci@visual-basic.it"
    emailTask.Body = "Vi invio questa email dalla mia applicazione"
    emailTask.Show()
  End Sub

L'utilizzo di EmailComposeTask non richiede particolari spiegazioni, va aggiunto che esiste anche la proprietà Bcc per l'invio di email in copia nascosta. E' bene sottolineare che questo codice non invia automaticamente l'email, poichè l'invio è fatto a mano all'interno del client. Di questo launcher non è fornito uno screen shot poichè nell'emulatore non è impostabile un account di default.
Prendiamo ora in considerazione il launcher chiamato PhoneCallTask che, come il nome lascia intendere, attiva l'uso della chiamata telefonica. Ecco un esempio:

  Private Sub CallButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim callTask As New PhoneCallTask
    callTask.PhoneNumber = "+391122333"
    callTask.DisplayName = "Supporto tecnico"
    callTask.Show()
  End Sub

Nel momento in cui il launcher viene visualizzato verrà dapprima richiesta conferma sull'avvio della telefonata. Come vedete è semplicissimo impostare il numero di telefono da chiamare e un nome da visualizzare per la chiamata:

Anche cercare su Internet è facilissimo, grazie al launcher chiamato SearchTask:

  Private Sub SearchButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim searchTask As New SearchTask
    searchTask.SearchQuery = "visual basic"
    searchTask.Show()
  End Sub

I termini da ricercare sono contenuti nella proprietà SearchQuery. Si noti come la ricerca vada a recuperare anche eventuali applicazioni che corrispondono ai termini specificati:

Anche l'invio di sms è una caratteristica molto richiesta nelle applicazioni per dispositivi e in Windows Phone attivarla è davvero semplice usando SmsComposeTask:

  Private Sub SmsButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim smsTask As New SmsComposeTask
    smsTask.To = "+391122333"
    smsTask.Body = "Ci vediamo stasera?"
    smsTask.Show()
  End Sub

Anche in questo caso le proprietà da assegnare sono molto intuitive. Ecco il risultato:

In Windows Phone grande importanza è data all'integrazione con i più noti social network. Per tale ragione è possibile condividere facilmente link o il proprio status personale attraverso due appositi launcher: ShareLinkTask e ShareStatusTask. Ecco un loro esempio d'uso:

  Private Sub StatusButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim statusTask As New ShareStatusTask
    statusTask.Status = "Sto sviluppando un'app"
    statusTask.Show()
  End Sub

  Private Sub LinkButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim shareLink As New ShareLinkTask
    shareLink.LinkUri = New Uri("www.visual-basic.it", UriKind.Absolute)
    shareLink.Title = "Visual Basic Tips & Tricks"
    shareLink.Message = "Dal 1996 la community italiana su Microsoft Visual Basic"
  End Sub

Anche in questo caso le proprietà da assegnare sono veramente semplici da capire. E' opportuno ricordare che i social network con cui è integrato Windows Phone sono Windows Live, Facebook, Twitter e Linkedin.
L'ultimo launcher che prendiamo in considerazione si chiama MarketPlaceHubTasks e consente di aprire il Market Place dedicato alle app o alla musica:

  Private Sub MarketButton_Click(sender As System.Object, e As System.Windows.RoutedEventArgs)
    Dim marketHubTask As New MarketplaceHubTask
    marketHubTask.ContentType = MarketplaceContentType.Applications
    marketHubTask.Show()
  End Sub

La tipologia di contenuto (app/musica) è stabilita tramite la proprietà ContentType, il cui valore è costituito da uno dei valori dell'enumerazione MarketPlaceContentType (Application o Music):

Gli altri launcher relativi al Market Place, elencati all'inizio dell'articolo, non verranno trattati, ma il loro utilizzo è decisamente simile a quest'ultimo. La documentazione MSDN vi sarà di aiuto per capire come utilizzarli.

Conclusioni
I launcher costituiscono una grande opportunità nello sviluppo per Windows Phone, perché da un lato ci risparmiano il tempo necessario a creare appositi controlli, consentendoci di utilizzare direttamente funzionalità del sistema operativo, mentre dall'altro lato ci consentono di arricchire le nostre applicazioni con funzionalità particolarmente richieste.
Per ulteriori informazioni potete contattarmi al mio indirizzo di posta elettronica o visitare il mio blog.