GPS Functionality

Transcript

GPS Functionality
Tesina esame ‘Programmazione di Sistemi Mobile’
realizzata da Roberto Giuliani
matricola 633688
GPS Functionality
In questa tesina viene approfondito e sviluppato l’utilizzo del Global Positioning System (GPS) hardware presente nel
device. Prima di dedicarsi direttamente alla programmazione, diamo un veloce sguardo a cosa consiste il termine
GPS:
Il Sistema di Posizionamento Globale permette, attraverso ad una rete
satellitare dedicata di satelliti artificiali in orbita, di fornire ad un terminale
mobile o ricevitore GPS informazioni sulle sue coordinate geografiche ed un
orario. Indipendentemente dalle condizioni metereologiche e dalla posizione
sulla Terra.
La localizzazione avviene tramite la trasmissione di un segnale radio da parte
di ciascun satellite e l’elaborazione dei segnali ricevuti da parte del ricevitore.
Il suo grado di accuratezza è dell’ordine dei metri, in dipendenza delle
condizioni metereologiche, dalla disponibilità e dalla posizione dei satelliti
rispetto al ricevitore.
Per quanto riguarda i dispositivi Android, verranno utilizzate le Android Location-Based API per ricavare la posizione
corrente e mostrare tale informazioni sullo schermo, utilizzando un applicativo che lo permetta, quali Google Maps.
L’Android SDK contiene delle API che garantiscono l’aiuto nell’utilizzo del GPS hardware presente in molti dispositivi.
Ovviamente si assume che il device prescelto abbiamo incorporato tale hardware.
Android mette a disposizione differenti tipi di file per mantenere/ricevere le coordinate GPS riguardanti la posizione
del tuo dispositivo. Ogni file ha differente formato e contiene differenti informazioni:
1) kml
2) nmea
3) track
Anche in questi casi, prima di immergersi su tale file vediamone le principali funzionalità e caratteristiche.
KML (Keyhole Markup Language)
E’ un linguaggio basato su XML, creato per gestire dati geospaziali in tre dimensioni nei programmi quali Google
Earth, Google Maps, EarthBrowser e Google Desktop.
Ogni locazione ha obbligatoriamente una longitudine e una latitudine. Altri dati possono rendere la visualizzazione
più specifica, come inclinazione,
inquadratura e quota.
Come possibile vedere nell’immagine
qui a fianco, dove viene riportato:
Nome: GoogleEarth_
FacoltàScienzeIngegneria;
Longitudine: 12.24..
Latitudine: 44.4..
Altitudine: 0…
E altri campi vari.
Tali coordinate corrispondono alla
facoltà, in via Sacchi, Cesena, ForlìCesena, Italia.
NMEA National Marine Electronics
Association
Questo protocollo si basa sul
principio che la fonte, detta talker,
può soltanto inviare i dati
(sentences) e il ricevente, detto listener, può soltanto riceverli.
Il talker invia linee di informazioni ognuna indipendente
dalle altre. Tali informazioni contengono tutte le proprietà
per la localizzazione del dispositivo e da un prefisso che ne
distingue le varie tipologie.
Questi file possono contenere molteplici coordinate e
altitudini, possono inoltre rappresentare trips o come
spesso vengono chiamati ‘tracks’.
Infatti come si può vedere nell’immagine seguente le varie
coordinate corrispondono al percorso da via Venezia di
Cesena fino a via Sacchi. Raffigurano perciò un tracks con
precisione di circa un paio di metri.
Proseguiamo adesso in aspetti che riguardano più da vicino il nostro applicativo, vedendo gli aggiustamenti da
eseguire se si vuole utilizzare correttamente l’hardware GPS.
Il primo passo per lavorare con Android Location-Based API è di aggiustare il livello dei permessi. Ci sono due modi
per settare i permessi da Eclipse:
Il primo è attraverso l’interfaccia del Manifest di Android (Android Manifest Permission), doppio click nel file
AndroidManifest.xml dove si apre la finestra Android Manifest Overview. A questo punto occorre semplicemente
aggiungere nel campo Permission i seguenti nomi di permessi: ACCESS_GPS e ACCESS_LOCATION per Users
Permissions.
NOTA: Nelle ultime versioni i permessi possono anche avere un nome differente, quali ACCESS_COARSE_LOCATION e
ACCESS_FINE_LOCATION.
Inoltre per ricevere gli aggiornamenti sulle locazioni si possono utilizzare NETWORK_PROVIDER o GPS_PROVIDER, in
relazione al fatto che si utilizzi la rete o il GPS per ottenere le informazioni, questa scelta è compito del
programmatore.
La seconda maniera invece implica l’aggiunta dei permessi direttamente da codice presente
nell’AndroidManifest.xml manualmente. Le linee di codice da aggiungere sono le seguenti:
Iniziamo ora a scrivere il vero e proprio codice, prima di tutto occorre aggiungere gli import corrispondenti, in questo
caso semplicemente uno:
L’obiettivo è ricevere le coordinate dal GPS hardware incorporato nel dispositivo. Si crea perciò un LocationManager
che permetterà di estrarre le informazioni volute, cioè la longitudine e la latitudine. Il passaggio importante in questa
istanziazione è che deve essere passato al LocationManager un context, quale in questo caso LOCATION_SERVICE.
Come riporta l’immagine sottostante.
Per inserire le coordinate nell’oggetto viene invocato il metodo getLastKnownLocation(PROVIDER). Questo metodo
ha bisogno di un parametro, il provider, il quale rappresenta la posizione.
E’ possibile inserire inoltre un ‘listener’ che viene invocato ogni qualvolta le coordinate cambiano, per mantenere
memorizzata sempre la posizione più corretta. Infatti viene sovrascritto solo il metodo onLocationChanged, il quale
invoca il metodo precedentemente creato.
A questo punto l’applicativo è in grado di ricavare la posizione corretta tramite il GPS e mostrarla a video. Ma
risultano essere solo dei numeri, cioè una latitudine ed una longitudine, sarebbe buona norma aggiungere un
supporto, come Google Maps, per consentire una visualizzazione anche della mappa circostante.
Vediamo come fare:
Il primo cambiamento da effettuare riguarda il file main.xml, nella quale viene aggiunto un layout per il componente
MapView.
Proseguendo occorre cambiare anche la classe a cui si ereditano i metodi; infatti prima l’estensione avveniva sulla
classe Activity, ma ora, con l’inserimento di un componente Mappa, occorre ereditare dalla classe MapActivity.
Successivamente si necessita di importare i vari
package MapActivity:
Il package Point viene utilizzato per il valore del punto che rappresenta la coordinata specifica dove invece il
MapController permetterà di incentrare tale punto sulla mappa di sottofondo. Ora siamo in grado di assegnare il
MapView ad un corretto id e di passargli delle coordinate.
Il successivo punto riguarda assegnare
all’oggetto Point i corretti valori, cioè i valori
correnti delle coordinate. Latitudine e
longitudine. Per fare ciò basta invocare il costruttore della classe al momento della creazione e passargli tali valori
(ricavati dal GPS) come parametri.
Possiamo ora creare l’elemento MapController, il quale sarà utilizzato anche per spostarsi correttamente all’interno
della mappa di Google Maps. Invochiamo il metodo getController() per impiantare un controller nella mia specifica
mappa, in questo caso nominata proprio myMap.
L’ultimo procedimento riguarda l’utilizzo del controller per spostarsi all’interno della mappa nella mia specifica
location. (Aggiungiamo inoltre un valore di zoom per garantire una visualizzazione accettabile anche del perimetro).
Il codice si conclude qui e, con una semplice esecuzione dell’applicativo, è possibile osservare i risultati richiesti.
Saranno simili a quelli mostrati in figura.
Siamo riusciti perciò, non solo a capire e
conoscere i file che contraddistinguono i
servizi GPS, ma è stato anche svolto un
semplice esercizio che inizialmente ricava la
posizione corrente e poi la visualizza su
mappa tramite il supporto rilasciato da
Google Maps.