Utilizzare il LocationManager per rilevare la posizione in Android

Come rilevare la posizione utente di un dispositivo Android tramite il LocationManager utilizzando il GPS e le reti cicostanti con il metodo onLocationChanged

Il LocationManager rappresenta il componente centrale del pacchetto android.location e fornisce un insieme di API in grado di calcolare le posizione dell’utente. Per poter richiedere i servizi di sistema per la localizzazione occorre utilizzare il metodo getSystemService() e specificare come valore il LOCATION_SERVICE. Come introdotto nell’articolo precedente, in Android i provider disponibili per calcolare la posizione utente sono due che nel LocationManager corrispondono a:

  • LocationManager.GPS_PROVIDER
  • LocationManager.NETWORK_PROVIDER

Attraverso il metodo getProvider() è possibile recuperare il provider desiderato e, oltre alle coordinate geografiche dell’utente, vengono fornite un gran numero di informazioni aggiuntive all’interno dell’oggetto Location come: latitudine, longitudine, orario, altitudine e velocità. Per poter utilizzare il LocationManager occorrono i permessi ACCESS_COARSE_LOCATION, per la localizzazione basata sui network, e ACCESS_FINE_LOCATION, per la localizzazione GPS, che devono essere specificati all’interno del manifesto dell’applicazione.

Spesso la prima rilevazione della posizione utente può richiedere qualche secondo, per ovviare a questo problema è possibile utilizzare il metodo getLastKnownLocation(). Questo meccanismo recupera l’ultima posizione in cui è stato rilevato il device, si tratta di un’informazione immediatamente disponibile ma può essere molto imprecisa: se un utente dovesse utilizzare l’applicazione in una città e il giorno successivo cambiare città, riportare la posizione nella vecchia città risulterebbe completamente sbagliato.

Per richiedere al sistema aggiornamenti sulle posizioni rilevate si utilizza requestLocationUpdates() in cui viene specificato:

  • Il provider scelto;
  • Il minimo numero di secondi che deve intercorrere tra una misurazione e la successiva;
  • La distanza minima (in metri) che deve esserci tra una misurazione e la successiva;
  • Un listener a cui arriverà una notifica ogni volta che la posizione dell’utente cambia.

Il listener da utilizzare nel metodo requestLocationUpdates() richiede i seguenti metodi:

  • onLocationChanged(): invocato ogni volta che si ricevono le coordinate di una nuova posizione;
  • onStatusChanged(): serve per notificare un cambio di stato di un provider in cui è possibile ricevere:
    • OUT_OF_SERVICE se il provider è fuori servizio;
    • TEMPORARILY_UNAVAILABLE quando il provider è temporaneamente non disponibile;
    • AVAILABLE se il provider è disponibile.
  • onProviderEnabled(): comunica che il provider indicato è stato abilitato;
  • onProviderDisabled(): comunica che il provider indicato è stato disabilitato.

Infine attraverso il metodo removeUpdates() viene fermata la rilevazione della posizione utente in Android.

Ecco un esempio di come settare un LocationManager e creare un LocationListener tratto dalla documentazione ufficiale.

  // Imposta il Location Manager
  LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);

  // Definisci il listener che risponde agli aggiornamenti delle posizione
  LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Metodo chiamato quando viene individuata una nuova posizione
      makeUseOfNewLocation(location);
    }

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

  public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

  // Registra un listener con il Location Manager che riceve gli aggiornamenti sulla posizione
  locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Indice:

In alternativa, per conoscere meglio il mondo Android ecco tutte le lezioni: Guida Android.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *