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!!
android java gps geolocation locationlistener locationmanager androidmanifest latitudine longitudin
1 Commenti
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