Visualizzazione stampabile
-
GPS Listener
Salve ragazzi,
non so se a qualcuno di voi è mai capitato di affrontare l'utilizzo delle coordinate GPS, ma io ho un problema dal quale non riesco ad uscirne.
Ho bisogno di tener traccia degli spostamenti di un Android, seguendo le coordinate GPS.
Inizialmente vedo se il gps è attivato, con:
codice:
boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
Tuttavia, può esserci anche l'eventualità che le coordinate non sia ancora pronte ed allora avrò come Lat/Long i valori Null.
Mi chiedevo se esiste una sorta di Listener, ad esempio OnGPSCoordinateChanged() che mi consenta di essere "avvisato" ogni qual volta le coordinate siano cambiate.
Qualcuno ne sa qualcosa a riguardo?
-
spero di ricordami bene ;)
hai bisogno di creare un nuovo LocationListener dentro al quale creerai il metodo onLocationChanged che viene chiamato ogni volta che le coordinate gps cambiano
ma le coordinate gps le tiri fuori proprio da dentro quel metodo non credo abbia senso prenderle da un altra parte
LocationListener | Android Developers
il primo esempio che ho trovato ora
How to get location data (with code samples!) - Droid Forum - Verizon Droid & the Motorola Droid Forum
-
Riesumo questo thread.
Esiste un modo per "ascoltare" quando il gps viene abilitato dalle impostazioni? Sto scrivendo un programma che parte ogni qual volta il gps viene attivato.
Per attivato intendo "acceso" anche senza coordinate.
Chi mi sa aiutare?
-
Quote:
Originariamente inviato da
Cecco
Riesumo questo thread.
Esiste un modo per "ascoltare" quando il gps viene abilitato dalle impostazioni? Sto scrivendo un programma che parte ogni qual volta il gps viene attivato.
Per attivato intendo "acceso" anche senza coordinate.
Chi mi sa aiutare?
prova a guardare questo evento:
public abstract void onProviderEnabled (String provider)
del tuo LocationListener.
Vado ad intuito ma secondo me dovrebbe funzionare se fai una cosa tipo: un servizio che parte al boot che registra il LocationListener del GPS e sta in ascolto sull'evento onProviderEnabled(). In quell'evento chiami startService() del servizio che ascolta OnLocationChanged() e killi il servizio dell'OnProviderEnabler ;).
Riferimento:
LocationManager | Android Developers
-
Ciao Azatoth, innanzitutto grazie per la tua tempestiva risposta.
Dunque...
anche io pensavo quel metodo onProviderEnabled. Infatti appena la mia applicazione è già un service che quando parte istanzia un listener che "ascolta" e mi aspettavo che, attivando il gps manualmente, questa funzione venisse invocata....e invece nisba!
Allora ho pensato ad un broadcast receiver, del tipo ACTION_PROVIDER_CHANGED, ma anche ascoltando quell'intent non si hanno risultati....
Mi chiedo come sia possibile....
-
Quote:
Originariamente inviato da
Cecco
Mi chiedo come sia possibile....
Facciamo un'analisi un po' più deep.
Il LocationListener è stato registrato con il "location manager service" usando il metodo requestLocationUpdates(String, long, float, LocationListener)?
A questo punto e solo dopo la chiamata a quel metodo, se è disabilitato il GPS viene chiamato "onProviderDisabled" immediatamente.
Poi appena viene abilitato allora viene chiamato "onProviderEnabled" e nel caso in cui cambia lo stato del GPS viene chiamato "onStatusChange": questo è il caso per esempio in cui entri in una galleria e 'perdi' il segnale... ergo cambia lo stato, oppure potrebbe scattare anche quando cambia il numero di satelliti con cui fai il fix e quindi migliora o peggiora l'accuratezza nel determinare la posizione.
Puoi metter qui qualche riga del tuo codice in modo da poter capire meglio dov'è il potenziale errore?
-
Ma certamente!
Dunque, alla dichiarazione delle mie variabili ho:
codice:
private static LocationManager loc;
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 static LocationListener onLocationChange=new LocationListener() {
public void onLocationChanged(Location loc) {
//sets and displays the lat/long when a location is provided
}
public void onProviderDisabled(String provider) {
Log.v(TAG, "onProviderDisabled");
}
public void onProviderEnabled(String provider) {
Log.v(TAG, "onProviderEnabled");
}
public void onStatusChanged(String provider, int status, Bundle extras) {
// required for interface, not used
}
};
Successivamente, ho definito:
codice:
loc = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); loc.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0,onLocationChange);
loc.addGpsStatusListener(gpsListener);
Il problema è che non entra nè in onGpsStatusChanged nè nel LocationListener....dove sbaglio?
Grazie
-
Ovviamente hai la user-permission nel manifest, vero ;)?
<uses-permission android:name="android.permission.ACCESS_FINE_LOCAT ION"/>
Così a occhio credo che sia tutto corretto, forse i parametri "0" che potrebbero essere impostati ad un valore più umano: metterei 1000 (è in millisecondi) il primo e 1 il secondo.
Prova a vedere se rileva i cambi di posizione.
Se li rileva... credo che debba necessariamente rilevare anche gli altri 2 eventi legati ad Enabled e Disabled.
Faccio qualche prova anche io, ma stasera perchè in ufficio comunque il GPS non prederebbe ;)
-
Dopo un po' di tentativi di compra / vendi, provo a dare una mano anche io.
Qua src/fede/geotagger/LocationUpdater.java at master from fedepaol's geotagger - GitHub c'e' il codice di un wrapperino che ho fatto per la mia applicazioncina (quasi pronta, a breve spero di farla uscire allo scoperto).
Magari ti puo' essere utile. Sul mio hero funziona.
Federico
-
Quote:
Originariamente inviato da
fedepaol
è probabile che a Cecco manchi la chiamata al getLastKnowLocation(...)