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.