Questo post è stato scritto da Matteo Pagani, MVP Device Application Development. Nei prossimi giorni pubblicheremo anche la seconda parte.

Introduzione

Il team di Windows Phone ha iniziato a rilasciare da un po’ di tempo a questa parte una serie di “recipes” (letteralmente, ricette): si tratta di librerie e tool che aiutano lo sviluppatore nell’implementazione di alcune feature e scenari all’interno di una applicazione Windows Phone.

In questo articolo vedremo come usare una di queste “recipe”, ovvero GPS Emulator: un’applicazione desktop WPF che, accompagnata da una libreria DLL da includere nella vostra applicazione, vi darà la possibilità di testare le funzionalità di geolocalizzazione stando comodamente seduti alla vostra scrivania.

L’articolo è diviso in due parti: in questa prima puntata vedremo i concetti base sulla geolocalizzazione nelle applicazioni Windows Phone e come utilizzare e configurare GPS Emulator. Nella seconda parte andremo invece a realizzare una semplice applicazione che fa uso dei servizi di geolocalizzazione, che testeremo con GPS Emulator.

Cos’è GPS Emulator?

Testare un’applicazione mobile che fa uso di geolocalizzazione non è semplice: se stiamo sviluppando un’app che ha solamente bisogno di capire a grandi linee in quale luogo ci troviamo è un conto, ma se la nostra applicazione deve tracciare precisamente un percorso (ad esempio, un’applicazione di jogging o un navigatore) il discorso si fa decisamente più complesso. Non possiamo di certo andare in giro con il nostro computer sottobraccio e il debugger di Visual Studio collegato al device J

GPS Emulator è una utilissima applicazione, sviluppata in WPF, che vi mette a disposizione la cartografia di Bing Maps, con la quale potrete cercare luoghi e definire dei punti di interesse. Una volta tracciato un percorso sulla mappa, vi basterà premere il pulsante Start per iniziare una simulazione di tale percorso: l’emulatore di Windows Phone, grazie alla libreria che accompagna il progetto (la quale sfrutta un servizo WCF per la comunicazione) riceverà di volta in volta le coordinate GPS aggiornate in base alla posizione corrente nell’applicazione.

Nella seconda parte di questo articolo andremo a sviluppare una semplice applicazione in cui useremo GPS Emulator per ricavare una serie di informazioni testuali sulla posizione: latitudine, longitudine e indirizzo civico.

Qualche informazione sui servizi di localizzazione di Windows Phone

Windows Phone fa uso di tre sistemi per geolocalizzare la posizione del device:

· Ricevitore GPS integrato: è il metodo più preciso, ma che richiede un maggior consumo di batteria. E’ adatto per applicazioni che devono tracciare con precisione gli spostamenti, ad esempio un navigatore satellitare.

· Segnale 3G: questo metodo utilizza la triangolazione del segnale all’interno delle cella dell’operatore mobile a cui siamo collegati per determinare la posizione. Consuma poca batteria, ma è meno preciso, dato che riesce a fornire solamente la posizione approssimativa all’interno della cella. E’ adatto per applicazioni che possono funzionare correttamente anche senza una precisione eccessiva (ad esempio, la ricerca dei cinema nella città in cui siamo o un client Twitter).

· Wi-Fi: questo metodo utilizza le informazioni della connessione Wi-Fi a cui siamo collegati per determinare la posizione. E’ una via di mezzo tra gli altri due: è abbastanza preciso e non consuma troppa batteria. Il “difetto” principale è che richiede una connessione ad una rete wireless attiva, cosa che, soprattutto in Italia, non è facile avere quando si è fuori casa o fuori ufficio.

La classe GeoCoordinateWatcher

La geolocalizzazione su Windows Phone ruota intorno alla classe GeoCoordinateWatcher: come dice il nome stesso, si tratta di un “watcher”, ovvero di un oggetto che rileva gli spostamenti del device e, tramite degli eventi che possiamo sottoscrivere, ci fornisce le coordinate correnti.

La classe GeoCoordinateWatcher nativa di Windows Phone fa parte del namespace System.Device.Location: la libreria che accompagna il progetto GPS Emulator implementa un suo GeoCoordinateWatcher, facente parte del namespace GpsEmulatorClient. Tale classe si sostituisce a quella originale e, invece di ricevere le informazioni dal GPS del telefono, le riceve dall’applicazione GPS Emulator.

Entrambe le classi GeoCoordinateWatcher hanno la stessa architettura ed implementano l’interfaccia IGeoPositionWatcher. Ecco perciò che, usando le direttive di compilazione (come #if e #else), possiamo inizializzare la nostra classe in maniera diversa a seconda del profilo che stiamo usando.

IGeoPositionWatcher<GeoCoordinate> watcher;

#if DEBUG

            watcher = new GpsEmulatorClient.GeoCoordinateWatcher();

#else

            watcher = new System.Device.Location.GeoCoordinateWatcher();

#endif

Questo codice fa sì che, se stiamo compilando l’applicazione utilizzando la configurazione di debug (il che tipicamente avviene durante lo sviluppo), verrà utilizzata la classe facente parte del progetto GPS Emulator. Se invece compiliamo l’applicazione in release (tipicamente quando dobbiamo pubblicarla sul Marketplace), verrà utilizzata la classe nativa del framework, facendo sì che vengano utilizzati i servizi di localizzazione del device vero e proprio.

Ora che abbiamo inizializzato l’oggetto, siamo pronti per metterci in ascolto dei due eventi esposti dalla classe:

· StatusChanged: questo evento viene scatenato ogni qualvolta lo stato del ricevitore GPS cambia. Gli stati possibili sono espressi dall’enumeratore GeoPositionStatus, che può assumere i seguenti valori:

o Disabled: i servizi di localizzazione non sono abilitati.

o Initializing: il servizio di localizzazione è in fase di inizalizzazione.

o NoData: il servizio di localizzazione è attivo e funzionante, ma non riesce a reperire informazioni sulla posizione corrente (ad esempio, perchè non c’è copertura).

o Ready: il servizio di localizzazione è attivo e funzionante.

· PositionChanged: questo evento viene scatenato ogni qualvolta il servizio di localizzazione recupera delle nuove informazioni sulla posizione corrente. La frequenza con cui viene scatenato questo evento dipende da due parametri dell’oggetto GeoCoordinateWatcher, ovvero:

o DesiredAccuracy: la precisione con cui vogliamo rilevare il segnale GPS, che può essere Default o High. Rappresenta il tipo di localizzazione tra quelli descritti in precedenza che vogliamo utilizzare.

o MovementThreshold: è la distanza in metri che deve essere coperta prima che i servizi tentino di effettuare una nuova localizzazione.

Una nota importante: l’oggetto GeoCoordinateWatcher implementato nella libreria GPS Emulator non supporta questa due proprietà. Dobbiamo ricordarci perciò, se abbiamo la necessità di utilizzarle, di racchiudere anch’esse in un blocco #if #else #endif, altrimenti riceveremo un errore in fase di compilazione.

Ora che abbiamo compreso cos’è e come funziona la classe GeoCoordinateWatcher, siamo pronti a vedere un esempio concreto di utilizzo.

Preparariamo il progetto di esempio

Per poter utilizzare GPS Emulator, dobbiamo scaricare il progetto alla pagina http://create.msdn.com/en-us/education/catalog/article/GPS-Emulator.

La “ricetta” include l’applicazione vera e propria, la libreria da utilizzare nelle nostre applicazioni più una serie di progetti di esempio.

Una volta scompattato il contenuto, apriamo Visual Studio 2010 (o la versione Express installata con i tool di sviluppo per Windows Phone) e creiamo un nuovo progetto Windows Phone, che sarà la nostra demo.

Dopodichè, aggiungiamo alla soluzione due dei progetti inclusi nella “ricetta”, ovvero GpsEmulator (l’applicazione vera e propria) e GpsEmulatorClient (la libreria che fa da tramite tra l’emulatore e la nostra applicazione). Per farlo, ci basta fare tasto destro sulla soluzione e scegliere l’opzione Add, Existing Project. A questo punto ci basta andare a prendere i due file di progetto GpsEmulator.cjsproj e GpsEmulatorClient.cjsproj, che troviamo dove abbiamo scompattato il contenuto della “ricetta”.

A questo punto, prima di metterci al lavoro, dobbiamo fare due interventi:

· Apriamo il file App.xaml.cs del progetto GpsEmulator, posizioniamoci all’interno dell’inizializzazione dell’applicazione (per intenderci, dopo App() {) e aggiungiamo la riga

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");

Questo perchè l’applicazione è stata sviluppata senza tenere conto che nel sistema metrico decimale il separatore dei decimale è la virgola. Se perciò stiamo sviluppando un’applicazione su un sistema con impostazioni regionali diverse da quelle americane (che invece fanno uso del punto), il GPS Emulator non funzionerà, dato che come separatore tra la latitudine e la longitudine viene utilizzato proprio la virgola (il che va in conflitto in caso di valori di posizione contenti decimali). Un metodo alternativo per risolvere lo stesso problema lo trovate in questo post di Michele Locuratolo.

· Aggiungiamo al nostro progetto Windows Phone una reference alla libreria GpsEmulatorClient. Per farlo ci basta cliccare con il tasto destro ul nostro progetto, scegliere Add Reference e selezionare, dall’elenco dei progetti facenti parte della soluzione, la voce GpsEmulatorClient.

Ora che abbiamo predisposto il tutto, ci manca un’ultima cosa per sfruttare appieno GPS Emulator: una Bing API Key. L’utilizzo del controllo Bing Maps all’interno di una applicazione (indipendentemente dalla tecnologia che si sta utilizzando) è soggetto alla richiesta di una API Key, ovvero una chiave che ci permette di “sbloccare” il controllo è sfruttarlo al 100% delle sue funzionalità.

Questa API Key ci servirà per due scopi:

· In GPS Emulator, per poterne sfruttare tutte le funzionalità: essa andrà inserità nel file di configurazione dell’applicazione (app.config) nella chiave BingApiKey.

· Nel progetto di esempio, per avere accesso al servizio esposto da Bing per la risoluzione degli indirizzi civici a partire da delle coordinate geografiche.

Come ottenere una Bing Api key

La Bing API Key è una chiave univoca che ci autorizza ad utilizzare i servizi di Bing all’interno delle nostre applicazioni. Non solo! Se abbiamo intenzione di utilizzare il controllo Bing Maps per Windows Phone, avremo bisogno di questa chiave per “sbloccare” il controllo e utilizzarlo al pieno delle sue funzionalità.

Per ottenerla, dobbiamo recarci sul sito https://www.bingmapsportal.com/, registrarci e creare una nuova applicazione. Una volta fatto, avremo la nostra chiave da inserire all’interno della nostra applicazione.

Ecco come fare:

1. Vai all’indirizzo http://www.bingmapsportal.com.

2. Clicca su Create per creare un nuovo account, previo accesso con il proprio Live ID.

image

3. Compila il form nella pagina seguente con le informazioni richieste. I dati obbligatori sono il nome dell’account e l’indirizzo e-mail.

image

4. Una volta completata la registrazione, verrete portati nella vostra area riservata già loggati. A questo punto cliccate sul link Create or view keys disponibile nella colonna di sinistra.

image

5. Nella pagina seguente, specificate i dati della vostra applicazione (scegliendo Mobile alla voce Type) e cliccate su Create key.

image

6. Vi verrà mostrata una schermata riepilogativa come la seguente: all’interno di quello che nell’immagine seguente è evidenziato da un riquadro rosso troverete la vostra chiave.

image

…continua…