Geolocalizzazione con Android

Mattepuffo's logo
Geolocalizzazione con Android

Geolocalizzazione con Android

Oggi vediamo come implementare la geolocalizzazione nelle nostre app per Android.

Andremo a scrivere una classe che si occuperà di recuperare latitudine e longitudine della nostra posiziione attuale.

Prima di tutto i permessi da mettere nell'AndroidManifest:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Dovrebbero bastare questi tre permessi.

La classe che scriveremo dovrà implementare l'interfaccia LocationListener, che si preoccupa di ricvere le notifiche di cambiamento di posizione dal LocationManager, che è la classe che si preoccupa di accedere al servizio di localizzazione.

A questo punto vediamo la classe:

public final class GPSTracker implements LocationListener {

    private final Context mContext;
    private boolean isGPSEnabled = false;
    private boolean isNetworkEnabled = false;
    private boolean canGetLocation = false;
    private Location location;
    private double latitude;
    private double longitude;
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10;
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1;
    private LocationManager locationManager;

    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }

    public Location getLocation() {
        locationManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
        isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        if (isGPSEnabled == false && isNetworkEnabled == false) {
            // NESSUN PROVIDER - AVVERTIRE UTENTE
        } else {
            this.canGetLocation = true;
            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                if (locationManager != null) {
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    if (location != null) {
                        latitude = location.getLatitude();
                        longitude = location.getLongitude();
                    }
                }
            }
            if (isGPSEnabled) {
                if (location == null) {
                    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES,MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    if (locationManager != null) {
                        location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                        if (location != null) {
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
            }
        }
        return location;
    }

    public void stopUsingGPS() {
        if (locationManager != null) {
            locationManager.removeUpdates(GPSTracker.this);
        }
    }

    public double getLatitude() {
        if (location != null) {
            latitude = location.getLatitude();
        }
        return latitude;
    }

    public double getLongitude() {
        if (location != null) {
            longitude = location.getLongitude();
        }
        return longitude;
    }

    public boolean canGetLocation() {
        return this.canGetLocation;
    }

    @Override
    public void onLocationChanged(Location location) {
    }

    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }

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

}

Al costruttore gli passiamo un unico oggetto Context, e poi si occupa di lanciare il metodo getLocation.

Con il metodo getSystemService a un servizio di sistema che ci serve; in questo caso a LOCATION_SERVICE.

Poi controlliamo che almeno uno tra GPS e rete sia attivi e sfruttabili (GPS_PROVIDER e NETWORK_PROVIDER).

Nel caso nessuno dei due fosse attivo dovete decidere come informare l'utente.

Se uno dei due è attivo facciamo una serie di operazioni, che altro non fanno che recuperare latitudine e longitudine.

I metodi che dovete guardarvi sono:

Tutto ciò può essere richiamato nella vostra Activity:

GPSTracker gpt = new GPSTracker(getBaseContext());
double latitudine;
double longitudine;
boolean gpsIsActive = false;
if(gpt.canGetLocation()) {
         gpsIsActive = true;
         latitudine = gpt.getLatitude();
         longitudine = gpt.getLongitude();
}

Direi che è tutto.

Ciao!!


Condividi

1 Commenti

  • francesco

    ho provato il tuo esempio. Ho commentato la parte riguardante il network state, perchè vorrei che prendesse i dati dal gps. ma location mi ritorna sempre null? mi sai dire perchè?

    27/08/2014

Commentami!