DevCorner: otteniamo le nostre coordinate con GPS o Internet
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
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.