Windows Phone 7 Location Service
Il servizio “Location Service”, come indica il nome stesso, consente di notificare alle applicazioni che lo utilizzano la posizione corrente del device.
Il servizio ottiene i dati da fonti diverse in base alle impostazioni (effettuabili da codice) che l’applicazione che lo utilizza fornisce. Chi ha lavorato con servizi simili sa bene che l’utilizzo di risorse hardware comporta inevitabilmente l’utilizzo della batteria e che molto spesso più le risorse sono “buone” più consumano batteria e viceversa. Occorre quindi trovare sempre il giusto bilanciamento fra il consumo della batteria e l’utilizzo di hardware: nel caso del servizio “Location Service” la regola, oltre al consumo di batteria, deve tener conto anche dell’accuratezza delle rilevazioni.
In pratica per rintracciare la posizione del device è possibile usare
1) Wi-Fi: meno accurato di un GPS, ma consuma meno batteria
2) GPS: più accurato ma maggior consumo di batteria
In pochi sanno che anche la rete “cellulare” fornisce informazioni sulla location, sicuramente meno accurate di un GPS e del Wi-Fi, ma che, ovviamente, meno drenanti per la batteria: inoltre l’antenna “cellular” è probabilmente già accesa per altri ovvi motivi :-)
Le classi che consentono di usare il servizio dispongono di un livello di accuratezza impostabile dall’applicazione che le usa: è possibile quindi gestire dall’applicazione, a seconda del suo utilizzo, la tipologia di sensore da utilizzare.
Se l’applicazione può lavorare con dati più o meno accurati potrebbe essere un’ottima idea chiedere all’utente (con messaggi chiari e semplice) come vuole ottenere i dati in modo che, come accade per molte altre funzionalità native di un telefono moderno, sia lui a scegliere come comportarsi. Un’ulteriore buona idea potrebbe essere informare l’utente quando la batteria scende sotto una soglia (ad esempio un 30%) con un messaggio che lo informa che “sarebbe bene abbassare il livello di accuratezza” per evitare di rimanere a piedi.
Oltre all’impostazione Low/High della classe GeoCoordinateWatcher, è possibile impostare anche MovementThreshold: questa proprietà consente di filtrare i movimenti entro un certo numero di metri prima di segnalare all’applicazione all’avvenuto spostamento dell’utente; nel caso di utilizzo di un livello di accuratezza alto è molto probabile infatti che vengano captati anche piccoli movimenti che rischiano di inviare troppi eventinon significativi all’applicazione: ad esempio se l’applicazione ricerca gli immobili in vendita nelle vicinanze non è importante modificare i dati effettuando una nuova ricerca se l’utente si è spostato di 2 metri :-)
E’ necessario preparare l’applicazione in modo da gestire la mancanza di “segnale”.
Ecco un esempio per capire come si utilizzano le classi e prendere la mano con i sensori; seguirà poi un articolo di approfondimento.
Il form come sempre è molto semplice e presenta i due pulsanti per avviare e fermare il servizio.
Alla ricezione dell’evento di notifica della posizione valorizzeremo i due TextBlock Lat e Long, mentre l’ultimo TextBlock rappresenta lo stato del servizio.
Il codice della parte Silverlight, senza nessuna pretesa grafica o “pretesa in generale” :-) è la seguente:
Ho tagliato la parte iniziale e le parti non significative.
Veniamo al codice di gestione del servizio:
La classe GeoCoordinateWatcher consente di impostare l’accuratezza direttamente nel costruttore. La seconda riga imposta invece il filtro sul movimento entro i 20 metri.
L'evento di gestione del cambio di stato (che avviene da un thread secondario e quindi richiede una Invoke) è il seguente:
MyStatusChanged controlla l’enum GeoPositionStatus per capire se il servizio funziona o meno. Nel caso di Disabled il codice cerca di capire se l’utente ha disabilitato il servizio oppure il servizio stesso non funziona.
Il codice di recupero posizione è sempre gestito da un event handler che viene invocato da un thread separato.
Oltre al metodo MyPositionChanged che recupera Latitudine e Longitudine, il metodo StopTrackButton_Click non fa altro che fermare il servizio.
In questo esempio non è stato usato un try/catch per semplificare il codice, ma ovviamente è necessario prevedere, come accennato all’inizio dell'articolo, i casi di eccezione.
Oltre alle due informazioni recupare nell’esempio è possibile conoscere anche l’altitudine, la velocità come dimostra il debug sulla proprietà Position di GeoCoordinate
Nel mio caso non sto simulando nessun dato sull’emulatore quindi tutti i valori risultano NaN.