android-GPS

Ormai il gps è una parte fondamentale di molte app, dal “dove mi trovo” di Facebook fino alle classiche mappe di Google che ci fanno da navigatore, ma anche per moltissime altre applicazioni che si basano sull’uso del Gps e sulla nostra posizione.

Ma come integrare il tutto in una nostra app?
Su internet girano numerose guide, molte delle quali spesso e volentieri non funzionano perché mancano di funzioni fondamentali, o semplicemente sono poco chiare, quindi abbiamo deciso di fare questa piccola (e semplice) guida che spiega le basi del gps!

Iniziamo col codice:

package com.example.contakm;

import android.app.Activity;
import android.content.Context;
import android.location.GpsStatus;
import android.location.GpsStatus.Listener;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class AndroidGPSTrackingActivity extends Activity {
private LocationManager lm;
private TextView speed,longitude,latitude,averagespeed;
private double averageS;
int count;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

speed=(TextView)findViewById(R.id.textView1);
longitude=(TextView)findViewById(R.id.textView5);
latitude=(TextView)findViewById(R.id.textView4);
averagespeed=(TextView)findViewById(R.id.textView7);

longitude.setText(“”);
latitude.setText(“”);
// …

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

                           // creo il provider gps

                           if ( lm.isProviderEnabled(LocationManager.GPS_PROVIDER) ) {

                                                      startGpsTracking();

                           }else{
//genera l’errore
}

                           }

private void startGpsTracking() {

//mandiamo in listening il tutto

                           lm.addGpsStatusListener(gpsListener);

                           lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000 , 5, myLocListener );

}

private Listener gpsListener= new Listener () {
public void onGpsStatusChanged(int status) {

                           switch (status) {

                                                      case GpsStatus.GPS_EVENT_FIRST_FIX:

                                                      Log.d(“tag”, “onGpsStatusChanged First Fix”);

                                                      break;

                                                      case GpsStatus.GPS_EVENT_SATELLITE_STATUS:

                                                      Log.d(“tag”, “onGpsStatusChanged Satellite”);

                                                      break;

                                                      case GpsStatus.GPS_EVENT_STARTED:

                                                      Log.d(“tag”, “onGpsStatusChanged Started”);

                                                      break;

                                                      case GpsStatus.GPS_EVENT_STOPPED:

                                                      Log.d(“tag”, “onGpsStatusChanged Stopped”);

                                                      break;
}
}
};

private LocationListener myLocListener = new LocationListener(){

//questa funzione viene chiamata ogni cambiamento di posizione

                           public void onLocationChanged(Location location) {

                                                      Log.d(“tag”, “onLocationChanged”);
speed.setText(((int)(location.getSpeed()*3.6))+”km/h”);
longitude.setText(location.getLongitude()+””);
latitude.setText(location.getLatitude()+””);
count++;
averageS+=location.getSpeed()*3.6;
averageS/=count;
averagespeed.setText(((int)averageS)+”km/h”);

}
public void onProviderDisabled(String provider) {
Log.d(“tag”, “onProviderDisabled”);
}
public void onProviderEnabled(String provider) {
Log.d(“tag”, “onProviderEnabled”);
}
public void onStatusChanged(String provider, int status, Bundle extras) {

                           Log.d(“tag”, “onStatusChanged”);
}
};

}

 

 

 

Ora non ci resta che analizzare le funzioni principali, il tutto si basa sulla “onLocationChanged” che è un metodo del listener GPS, cosa fa?
Semplice, quello che gli diciamo noi di fare, in questo caso prendere la velocità con il metodo del locationmanager e stamparla in una textview, ovviamente conoscendo i listener sappiamo che non dobbiamo fare altro, il metodo verrà chiamato ogni quando la posizione del GPS cambierà, questo dipende principalmente dalla precisione del GPS, solitamente un buon sensore, ha precisione al metro, quindi per ogni metro percorso ci sarà questo metodo che verrà chiamato in quanto la posizione cambierà e verrà eseguita l’azione a noi scelta.

Altra parte principale in tutti i programmi GPS è la creazione del provider, che in parole povere, sarebbe la connessione al GPS, ovviamente per quello dovremo affidarci principalmente ad Android e settargli i vari listener per quando la posizione cambia o per lo stato del GPS (lo stato è se il gps si trova gia acceso, se è in attesa del segnale o comunque cosa sta facendo in quel momento).

 

Messi insieme i pezzi, si ottiene questa piccola app, che misura latitudine, longitudine ed eventuale velocità, con relativa media, per integrarla nei vostri progetti ovviamente, basta eliminare tutte le TextView e lasciare il codice intatto!

Ovviamente mai dimenticarci di inserire nel Manifest.xml la seguente stringa di permessi:

 

<uses-permission android:name=”android.permission.ACCESS_FINE_LOCATION” />

Se non inseriamo tale permesso la app crasherà nel momento in cui cercherà di accedere al gps!

Per evitare che vi siano errori nella visualizzazione del codice, posto qui il link della versione identata correttamente
 

[via]