DevCorner620

DevCorner: otteniamo le nostre coordinate con GPS o Internet

Giuseppe Tripodi

Uno dei principali vantaggi dell’usare uno smartphone è la possibilità di avere servizi personalizzati in base alla propria posizione: per agevolare gli utenti in questo senso, è necessario ottenere le coordinate dello smartphone (Latitudine e Longitudine). Vediamo quindi insieme come fare!

Innanzitutto, partiamo dicendo che ci sono diversi modi per riuscire a ricavare la posizione del nostro telefono: GPS (più accurato) o la semplice connessione dati: di gestire entrambe su Android se ne occupa un servizio del sistema che ci faciliterà incredibilmente le operazioni.

Per prima cosa, come sempre, creiamo una nuova Applicazione: noi l’abbiamo chiamata Geolocalizzazione (la fantasia non è il nostro forte!), voi battezzatela pure come preferite. Una volta creata, la prima cosa da fare è aggiungere i Permessi necessari al Manifest. Questo potrebbe risultare nuovo per alcuni di voi, ma per utilizzare alcune funzionalità del telefono (come ad esempio la localizzazione GPS o Internet), è necessario specificare che abbiamo bisogno di detti Permessi: non sono altro che l’elenco che la maggior parte degli utenti salta senza leggere (molto male!) quando installa un nuovo software.

Rechiamoci quindi su AndroidManifest.xml e sul tab Permissions (in basso), clicchiamo su Add e successivamente Uses Permissions e aggiungiamo i seguenti:

  • android.permission.ACCESS_COARSE_LOCATION
  • android.permission.ACCESS_FINE_LOCATION
  • android.permission.INTERNET

permessi

Fatto questo, per essere sicuri di aver agito correttamente, controllate che nel codice xml del file (visibile cliccando l’ultimo tab in basso, AndroidManifest.xml) siano presenti le seguenti righe:

  

A questo punto, preoccupiamoci della nostra interfaccia: tutto quello di cui abbiamo bisogno in questo tutorial sono tre semplici TextView nelle quali andremo a impostare se stiamo utilizzando il GPS o meno, la Latitudine e la Longitudine. Il tutto, quindi, avrà il seguente aspetto:

Terminata le gestione dell’interfaccia andiamo nel nostro codice Java, dove ci divertiremo un po’ nell’OnCreate: tutto quello che dobbiamo fare, infatti, è chiedere al sistema operativo di cercare per noi le coordinate dove si trova il telefono ed impostarle nelle nostre TextView.

Per prima cosa, quindi, utilizziamo un oggetto di tipo LocationManager: si tratta di una classe di Android che si occupa, appunto, di localizzare il telefono. Per istanziarlo, digitiamo quanto segue nell’OnCreate:

 LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

A questo punto, creiamo una variabile booleana chiamata gps e impostiamola a ture se il GPS è attivo, a false se, contrariamente, dovremo usare la connessione dati.

boolean gps = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);

Ovviamente, la variabile andrà inserita in un if, che controllerà se il GPS è attivo o meno: nelle due condizioni specificheremo se stiamo usando il GPS o la connessione dati e otterremo latitudine e longitudine in base alle impostazioni.
Per prima cosa, affrontiamo il caso del GPS disattivato, e scriviamo la prima delle nostre condizioni:

  if (!gps) {
        	
        	
        	
        	new AlertDialog.Builder(this).setTitle("GPS Disabilitato").create().show();
        	
        	
        	TextView providerText = (TextView) findViewById(R.id.provider_txt);
        	providerText.setText("Sto usando la connessione dati");

           
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    60000, 
                    100, 
                    new LocationListener() {

    					@Override
    					public void onLocationChanged(Location location) {
    					
    			        	TextView latitudine = (TextView) findViewById(R.id.latitude_txt);
    			        	TextView longitudine = (TextView) findViewById(R.id.longitude_txt);

    			        	latitudine.setText("La latitudine è: "+String.valueOf(location.getLatitude()));
    			        	longitudine.setText("La longitudine è: "+String.valueOf(location.getLongitude()));
    					}

    					@Override
    					public void onProviderDisabled(String provider) {}

    					@Override
    					public void onProviderEnabled(String provider) {}

    					@Override
    					public void onStatusChanged(String provider, int status, Bundle extras) {}
            	
            });
        }

Come potete notare, entriamo nel codice solo nel caso di (!gps), ossia se la variabile booleana gps è falsa: all’interno, dopo aver creato un alert in cui informiamo che il GPS è disattivato, richiamando il LocationManager utilizzando la connessione dati (lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER), specifichiamo che deve controllare gli spostamenti ogni minuto (60000 millisecondi) e ogni 100 metri e, nel caso trovi una variazione nella nostra posizione, deve impostare le due TextView con la nostra Latitudine e Longitudine attuale.

La seconda parte del codice è in realtà molto simile, e si differenzia soltanto per il modo di richiamare il LocationManager, al quale specifichiamo stavolta di usare il GPS: lm.requestLocationUpdates(LocationManager.GPS_PROVIDER

Il risultato finale della nostra MainActivity, sarà quindi qualcosa di simile:

package com.peppeuz.geolocalizzazione;


import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.widget.TextView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        
       
        boolean gps = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        
        if (!gps) {
        	
        	new AlertDialog.Builder(this).setTitle("GPS Disabilitato").create().show();
        	
        	
        	TextView providerText = (TextView) findViewById(R.id.provider_txt);
        	providerText.setText("Sto usando la connessione dati");

            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                    60000, // 1 minute interval between updates
                    100, // 100 meters between updates
                    new LocationListener() {

    					@Override
    					public void onLocationChanged(Location location) {
    						
    			        	TextView latitudine = (TextView) findViewById(R.id.latitude_txt);
    			        	TextView longitudine = (TextView) findViewById(R.id.longitude_txt);

    			        	latitudine.setText("La latitudine è: "+String.valueOf(location.getLatitude()));
    			        	longitudine.setText("La longitudine è: "+String.valueOf(location.getLongitude()));
    					}

    					@Override
    					public void onProviderDisabled(String provider) {}

    					@Override
    					public void onProviderEnabled(String provider) {}

    					@Override
    					public void onStatusChanged(String provider, int status, Bundle extras) {}
            	
            });
        } else {
        	
        	TextView providerText = (TextView) findViewById(R.id.provider_txt);
        	providerText.setText("Sto usando il GPS");

           
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                    60000, 
                    100, 
                    new LocationListener() {

    					@Override
    					public void onLocationChanged(Location location) {
    						
    			        	TextView latitudine = (TextView) findViewById(R.id.latitude_txt);
    			        	TextView longitudine = (TextView) findViewById(R.id.longitude_txt);

    			          	latitudine.setText("La latitudine è: "+String.valueOf(location.getLatitude()));
    			        	longitudine.setText("La longitudine è: "+String.valueOf(location.getLongitude()));
    					
    					}

    					@Override
    					public void onProviderDisabled(String provider) {}

    					@Override
    					public void onProviderEnabled(String provider) {}

    					@Override
    					public void onStatusChanged(String provider, int status, Bundle extras) {}
            	
            });
        }
    }


}

Il semplice tutorial di questa settimana è finito: adesso potrete sempre sapere dove siete (anche quando il caldo vi dà alla testa!), ma se non sapete, invece, dove trovare aiuto, non avete che da chiedere sul nostro forum.

Via: DevCorner