Crea sito
Facebook GooglePlus Twitter
Diaspora YouTube LinkeIn

[GUIDE] GPS lat long alt speed

È la sezione che ti insegna a programmare il robottino verde che fa impazzire il mondo e tutti lo mettono su tutto. Entra e comincia a studiare e fare pratica.

[GUIDE] GPS lat long alt speed

Messaggio da leggereda benedetto il 12/01/2013, 14:59

Immagine

Ecco a voi una breve guida sulle api che riguardano la geolocalizzazione con LocationManager sul nostro robottino.
Il nostro intento sarà quello di prendere latitudine, longitudine, altitudine e velocità soprattutto, per ottenere questo obrobrio a livello grafico :D :D
Immagine

Innanzitutto su eclipse facciamo un nuovo progetto, con un activity vuota, e iniziamo subito a modificare l'activty_main.xml eliminando l'Hello world e aggiungendo due textview, una per i dati e una per il link alle mappe di google. Questa sarà la nostra activity, grezza quanto volete, non vi insegno a diventare designer, ma funzionale :)

Ecco quindi come sarà, piu' o meno, la activity_main.xml (o come l'avete chiamata):
Codice: Seleziona tutto
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Main" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:id="@+id/textview1"
        android:text="no data" />

    <TextView
        android:id="@+id/textview2"
        android:autoLink="web"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textview1"
        android:layout_centerHorizontal="true"
        android:text="no data" />

</RelativeLayout>


Notiamo poche cose, semplici: i testi, e android:autoLink="web" che ci permette di rendere "cliccabile" il link che metteremo in futuro.

Quindi aggiungete nell'AndroidManifest.xml le righe per il permesso di usare il GPS e la localizzazione tramite rete wifi, che renderà conscio l'utente finale di cosa useremo, e renderà utilizzabile l'app.
Ecco dunque il manifest:
Codice: Seleziona tutto
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.main"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
   
    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.main.Main"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


Le righe che ci interessano sono ovviamente <uses-permission ... />

Ora nella nostra MainActivity.java (o come l'avete chiamata) iniziamo a programmare.
Innanzitutto definiamo le variabili che ci serviranno come globali, quindi nella classe ma fuori da ogni metodo:
Codice: Seleziona tutto
double speed = 0;  // velocità in metri al secondo che verrà aggiornata di volta in volta
TextView textview1;  // la textview 1 che conterrà i dati
TextView textview2;  // la textview 2 che conterrà il link
LocationManager locationManager;  // il gestore di posizione :) con cui aggiorneremo i dati


Bene, quindi nel metodo onCreate() sovrascritto aggiungiamo il setup per la activity e per il LocationManager:
Codice: Seleziona tutto
textview1 = (TextView) findViewById(R.id.textview1);
textview2 = (TextView) findViewById(R.id.textview2);
locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);


Sono un amante del comando singolo, scusatemi :) Comunque nella terza riga recuperiamo prima il context, con getApplicationContext(), e poi dal context preleviamo il servizio di localizzazione Context.LOCATION_SERVICE

Dunque ora i metodi di pausa dell'app, onResume e onPause:
Codice: Seleziona tutto
@Override
   protected void onResume() {
     super.onResume();
     Criteria c = new Criteria();
     c.setAccuracy(Criteria.ACCURACY_FINE);
     locationManager.requestLocationUpdates(locationManager.getBestProvider(c, true), 400, 1, this);
   }

   @Override
   protected void onPause() {
     super.onPause();
     locationManager.removeUpdates(this);
   }

La chiave della geolocalizzazione è in onResume: generiamo una richiesta di refresh, tramite il provider (gps o wifi) migliore per accuratezza, grazie alla classe Criteria, grazie al metodo getBestProvider, che chiede il criterio e se il provider deve essere attivato (true), e grazie al metodo requestLocationUpdates dell'oggetto locationManager inizializzato nell' onCreate.
A locationManager.requestLocationUpdates diamo come argomento il provider, il tempo minimo in millisecondi tra gli update (400 in questo caso, aumentate se volete un consumo minore di batteria e una minore frequenza), la distanza minima per cui vale la pena fare l'update in metri (1) e un LocationListener che attende il cambiamento della posizione e opera di conseguenza.
In questo caso io ho messo tutto insieme, e quindi ho dichiarato la classe che normalmente estende Activity, ma che implementa anche LocationListener, aggiungendo vari metodi che vedremo avanti.
Tutto questo si fa aggiungendo implements LocationListener alla fine della definizione della classe prima della prima parentesi graffa.

Di conseguenza dovremo implementare 4 metodi: onLocationChanged, onProviderDisabled, onProviderEnabled, e onStatusChanged. Il piu' rilevante ovviamente è il primo, che è da me sì fatto:
Codice: Seleziona tutto
@Override
public void onLocationChanged(Location location) {
   speed = location.getSpeed();
   double lat = location.getLatitude();
   double log = location.getLongitude();
   double alt = location.getAltitude();
   textview1.setText(""+speed+" m/s\nlat: "+lat+"\nlong: "+log+"\nalt: "+alt);
   textview2.setText("http://maps.google.com/?q="+lat+","+log);
}


Molto semplicemente prende dall'argomento location la velocità (gia' calcolata per noi) e i dati quali latitudine, longitudine e altitudine, e setta il testo nelle textview.

Negli altri metodi da sovrascrivere non c'è molto, quando cambia provider semplicemente facciamo apparire un Toast (non da mangiare :P ) e richiamiamo onResume(), mentre nell'ultimo metodo non facciamo niente, non è rilevante ai nostri fini.

Codice: Seleziona tutto
@Override
public void onProviderDisabled(String provider) {
   Toast.makeText(this, "Disabled provider " + provider, Toast.LENGTH_SHORT).show();
   onResume();
}

@Override
public void onProviderEnabled(String provider) {
   Toast.makeText(this, "Enabled new provider " + provider, Toast.LENGTH_SHORT).show();
   onResume();
}

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


Bene, facciamo andare ora l'app, e buon divertimento!
Se qualcosa non quadra, o se qualquadra non cosa, scrivete pure ;)

Buon coding ;)
Elementary OS... ma nostalgia di Gentoo :geek:
Avatar utente
benedetto
Brigata Linux
 
Messaggi: 364
Iscritto il: 22/05/2012, 22:43
Località: Milanoooo

  • Condividi e Vota l'articolo
  • Condividi e questo articolo di LaScaricata

    Share on Tumblr

Re: [GUIDE] GPS lat long alt speed

Messaggio da leggereda MatteoConti91 il 01/05/2013, 18:32

Ciao! Scusami ma c'è "qualquadra che non cosa"; ho seguito tutte le istruzioni ma quando vado a compilare il programma si avvia sulla macchina virtuale e va in crash. Da cosa può dipendere? Ti invio il progetto? Grazie.
MatteoConti91
 
Messaggi: 1
Iscritto il: 01/05/2013, 18:26

Re: [GUIDE] GPS lat long alt speed

Messaggio da leggereda benedetto il 02/05/2013, 0:09

Se riesci a circoscrivere l'errore tramite un po' di debugging sarebbe ottimo, ad esempio vedere passo passo se ogni parte di codice fa quello che vuoi (commentando altre parti di codice e decommentandole man mano), ma comunque in genere è colpa dei permessi non inseriti nel manifest.
Se vuoi puoi inviarmelo comunque, scrivimi un PM ;)
suppongo che tu stia usando eclipse su windows..?
bon, fammi sapere, ciao
Elementary OS... ma nostalgia di Gentoo :geek:
Avatar utente
benedetto
Brigata Linux
 
Messaggi: 364
Iscritto il: 22/05/2012, 22:43
Località: Milanoooo

Re: [GUIDE] GPS lat long alt speed

Messaggio da leggereda florin88 il 02/05/2013, 0:42

MatteoConti91 ha scritto:Ciao!


potesti passare anche per questa sezione => viewforum.php?f=2 => e lasciare una piccola presentazione ??? grazie :sal: :y:
Avatar utente
florin88
Moderatore Globale
 
Messaggi: 2159
Iscritto il: 26/02/2012, 14:51
Località: tutta l'italia


Torna a Programmazione Android

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite

cron
 
Creative Commons License

Dichiarazione di non responsabilita': Nessuno dei files indicati su questo sito e' ospitato o trasmesso da questo server. I links sono forniti dagli utenti del sito, basandosi su servizi esterni. Il progetto LaScaricata non puo' essere ritenuto in alcun modo responsabile per qualsiasi pubblicazione o altra azione commessa dagli utenti. Non e' consentito usare questo sito per la distribuzione o il download di materiale se non si e' espressamente autorizzati a farlo. Siete tenuti a rispettare termini e regolamento del sito.