Autore Topic: Problema nel geolocalizzare con LocationManager  (Letto 2039 volte)

Offline E.Musso

  • Utente junior
  • **
  • Post: 82
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy GT-S5660
  • Play Store ID:
    Emiliano Musso
  • Sistema operativo:
    Windows 7
Problema nel geolocalizzare con LocationManager
« il: 30 Gennaio 2012, 21:15:15 CET »
0
Ciao a tutti,
scrivo per sottoporvi un problema che so essere banale, ma per il quale non riesco a trovare soluzione.

Sostanzialmente, ho creato un'app per inviare ad una lista di contatti un messaggio rapido di emergenza, contenente le proprie coordinate geolocalizzate. Il problema è che pare che la geolocalizzazione avvenga con successo 1 volta su 10, mentre le restanti volte, il valore di latitudine e longitudine rimangono a zero.

Qui sotto incollo il codice incriminato: ho rimosso tutte le parti di corredo, nonché la parte di invio SMS, che in questo caso non serve. Avrei necessità di capire perché il codice che geolocalizza pare essere inaffidabile (l'utente che mi ha segnalato questa cosa, ha contro-provato con un'altra app, e pare che in quel caso non ci siano mai stati problemi nel determinare la posizione).

Un grazie a chiunque mi darà una mano.

Codice (Java): [Seleziona]
public class MainActivity extends Activity implements LocationListener{
        LocationManager  locationManager  = null;
        Location location         = null;
        String     provider         = null;
       
        String           rContacts        = null;
        String           rMessage         = null;
        boolean        rSendNET         = false;       
       
        Context          mContext         = null;
        Resources      mRes             = null;
        double            latitude         = 0;
        double            longitude        = 0;
       
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        mRes     = getResources();
        mContext = getApplicationContext();
       
        getParameters();
                       
        Button helpButton = (Button)findViewById(R.id.help_button);
        helpButton.setOnLongClickListener(new OnLongClickListener(){
                        @Override
                        public boolean onLongClick(View arg0) {
                       SmsManager smsMan = SmsManager.getDefault();
                       
                       String numbers[] = rContacts.split("\r?\n");
                       for (int i=0;i<numbers.length; i++){
                           if (numbers[i].compareTo("") == 0) continue;

                           // INVIO SMS
                       }
                       
                           return false;
                        }
        });
       
    }
   
    private void getParameters(){
                           
           locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);          
           String provider = null;
           if (rSendNET)  // flag che controlla se usare GPS o NETWORK
              provider = LocationManager.NETWORK_PROVIDER;
           else
              provider = LocationManager.GPS_PROVIDER;
         
           location = locationManager.getLastKnownLocation(provider);
           locationManager.requestLocationUpdates(provider, 1000, 0, this);
           
    }

    public static double getRound(double x, int digits){
        double powerOfTen = Math.pow(10, digits);
        return ((double)Math.round(x * powerOfTen) / powerOfTen);
    }
   
    private void updateLocazione (Location mlocation){
       latitude  = getRound(mlocation.getLatitude() , 4);
       longitude = getRound(mlocation.getLongitude(), 4);              
    }
   
        @Override
        public void onLocationChanged(Location mlocation) {
           updateLocazione(mlocation);
        }

        @Override
        public void onProviderDisabled(String mprovider) { }

        @Override
        public void onProviderEnabled(String mprovider) {       }


        @Override
        public void onStatusChanged(String mprovider, int status, Bundle extras) { }
 
   
        @Override
        protected void onResume() {
                super.onResume();
                getParameters();
        }

        @Override
        protected void onPause() {
                super.onPause();
                if (locationManager != null) locationManager.removeUpdates(this);
        }
       
        @Override
        protected void onDestroy() {
                super.onDestroy();
                if (locationManager != null) locationManager.removeUpdates(this);
        };

}
Bollettazione Interventi - Un taglio ai costi di tipografia per professionisti!
--
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema nel geolocalizzare con LocationManager
« Risposta #1 il: 30 Gennaio 2012, 23:33:48 CET »
0
Secondo me potresti inserire un controllo dell'accuracy nel onLocationChanged, in modo da scartare eventuali location poco precise. Dal codice, l'unico motivo che mi viene in mente per cui latitudine e longitudine rimangano a zero è qualche "difetto" di quel gps che magari in certi casi passa come valori iniziali 0.  ;-)

Offline E.Musso

  • Utente junior
  • **
  • Post: 82
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy GT-S5660
  • Play Store ID:
    Emiliano Musso
  • Sistema operativo:
    Windows 7
Re:Problema nel geolocalizzare con LocationManager
« Risposta #2 il: 30 Gennaio 2012, 23:59:04 CET »
0
Grazie per la risposta: in un certo senso, la "temevo", in quanto avrei preferito un bug al fatto di demandare la responsabilità al sensore  :-P

Una domanda: non mi è del tutto chiaro cosa tu intenda con controllo di accuracy. Che io sappia (ma di geolocalizzazione non sono certo un esperto) l'accuracy si setta - se necessario - a livello di Criteria, dichiarando il LocationManager: è possibile verificarla e correggerla anche successivamente? Ed in relazione a cosa posso definire quali rilevazioni siano da considerare "precise"? Puoi darmi qualche dritta per realizzare la funzione che mi suggerivi?
Grazie mille.
Bollettazione Interventi - Un taglio ai costi di tipografia per professionisti!
--
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema nel geolocalizzare con LocationManager
« Risposta #3 il: 31 Gennaio 2012, 00:27:09 CET »
+1
L'accuracy è un attributo della location, come latitude e longitude e la ottieni con location.getAccuracy(). Nell'onLocationChanged potresti controllare che il valore sia minore di un tot di metri che ritieni possa fare al caso tuo, e decidere di scartare le location meno precise. E' anche l'unico modo per scartare le prime location, che spesso sono quelle meno precise e che arrivano a raffica, a prescindere dai parametri di tempo e spazio passati al location manager.
Visto che si tratta di "emergenze", potresti anche settare entrambi i provider al location manager, in modo da ricevere gli aggiornamenti sulla posizione da entrambi i provider e rendere il "fix" il più veloce possibile. Se per caso il network provider è disabilitato, non succederà nulla, se non un richiamo del metodo onProviderDisabled().

I criteria sì, servono per lasciare decidere il sistema quale provider scegliere in base a determinate caratteristiche (per esempio accuracy e consumo di batteria) e non per limitarle. In più, facendo l'esempio dell'accuracy,  potrebbe essere benissimo che il network provider (meno preciso del gps) ti dia una location molto più precisa rispetto al gps, dopo lo stesso intervallo di tempo. Questo soprattutto in aree urbane.   :)

Offline E.Musso

  • Utente junior
  • **
  • Post: 82
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy GT-S5660
  • Play Store ID:
    Emiliano Musso
  • Sistema operativo:
    Windows 7
Re:Problema nel geolocalizzare con LocationManager
« Risposta #4 il: 31 Gennaio 2012, 08:30:14 CET »
0
Ti ringrazio, provo a percorrere questa strada  :-)
Bollettazione Interventi - Un taglio ai costi di tipografia per professionisti!
--
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato

Offline E.Musso

  • Utente junior
  • **
  • Post: 82
  • Respect: +17
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy GT-S5660
  • Play Store ID:
    Emiliano Musso
  • Sistema operativo:
    Windows 7
Re:Problema nel geolocalizzare con LocationManager
« Risposta #5 il: 31 Gennaio 2012, 16:48:25 CET »
0
Grazie ai tuoi suggerimenti, sono riuscito ad ottenere il risultato desiderato: questo è stato possibile utilizzando, tra le altre cose, due listener, uno legato al GPS e l'altro alla rete, sollevando l'utente dalla decisione in merito a quale usare, ma lasciando all'app il compito di trovare la propria sorgente. Ancora grazie.  :-)
Bollettazione Interventi - Un taglio ai costi di tipografia per professionisti!
--
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato

Offline droide

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC DESIRE Z
Re:Problema nel geolocalizzare con LocationManager
« Risposta #6 il: 15 Maggio 2012, 16:51:51 CEST »
0
Salve ragazzi :-). Stavo risolvendo lo stesso problema in merito ai provider di localizzazione. Io vorrei prelevare i dati due provider per velocizzare il fix. Io sono arrivato a questa soluzione:

Codice (Java): [Seleziona]
private void initGps() {
    try {
      lm = (LocationManager) getSystemService( Context.LOCATION_SERVICE );

      Criteria criteria = new Criteria();

      criteria.setAccuracy( Criteria.ACCURACY_FINE );
      criteria.setAccuracy(Criteria.ACCURACY_COARSE);
      lm.getBestProvider( criteria, true );

      locationListener = new FA_LocationListener();
      database = coordinate.getWritableDatabase();
    } catch (Exception e) {
     
    }

    minTime = getResources().getInteger( R.integer.minTime );
    minDistance = getResources().getInteger( R.integer.minDistance );

    lm.requestLocationUpdates( LocationManager.GPS_PROVIDER, minTime, minDistance, locationListener );
    lm.requestLocationUpdates( LocationManager.NETWORK_PROVIDER, minTime, minDistance, locationListener );
  }

Secondo voi  è una buona soluzione?. Ho richiamato due volte la requestLocationUpdates impostando i due provider. Il mio dubbio era:

Le coordinate da dove verranno prelevate una volta eseguito il fix? dal NETWORK_PROVIDER oppure dal GPS_PROVIDER? impostando i criteria , non sarà compito del sistema scegliere in seguito l'accuratezza FINE?

Grazie in anticipo :-)


Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema nel geolocalizzare con LocationManager
« Risposta #7 il: 15 Maggio 2012, 17:18:27 CEST »
0
Ciao!
Il compito della classe Criteria è lasciare che il sistema prenda autonomamente un location provider. Con
Codice (Java): [Seleziona]
 lm.getBestProvider( criteria, true ); ottieni una stringa corrispondente al provider che, secondo i criteria passati come primo paramentro, fa al caso tuo. La stringa poi deve essere usata come primo parametro quando richiami il requestLocationUpdates. Semplificando: lm.getBestProvider() non vuol dire "quando ti richiederò il posizionamento usa il miglior provider", bensì è: "dammi il nome del miglior provider che poi possa utilizzare quando richiederò il posizionamento".  :-)

La provenienza del "fix" sarà da entrambi i provider che hai usato e starà a te analizzare l'accuratezza del segnale e decidere se scartare o tenere la location passata.

Offline droide

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC DESIRE Z
Re:Problema nel geolocalizzare con LocationManager
« Risposta #8 il: 15 Maggio 2012, 18:22:08 CEST »
0

Salve. Per cui devo semplicemente richiamare la requestLocationUpdates() in questo modo?:

lm.requestLocationUpdates(lm.getBestProvider( criteria, true ), minTime, minDistance, locationListener );

Se ad esempio il GPS_PROVIDER NON è al momento pronto, allora la funziona getBestProvider() ritornerà  il NETWORK_PROVIDER? il seguito la funziona getBestProvider() ritornerà GPS_PROVIDER?

Grazie :-)



Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Problema nel geolocalizzare con LocationManager
« Risposta #9 il: 15 Maggio 2012, 18:40:12 CEST »
0
Salve. Per cui devo semplicemente richiamare la requestLocationUpdates() in questo modo?:

lm.requestLocationUpdates(lm.getBestProvider( criteria, true ), minTime, minDistance, locationListener );

Perfetto!  :-)

Citazione da: droide
Se ad esempio il GPS_PROVIDER NON è al momento pronto, allora la funziona getBestProvider() ritornerà  il NETWORK_PROVIDER? il seguito la funziona getBestProvider() ritornerà GPS_PROVIDER?

Edit: passando true come secondo parametro al getBestProvider(), ritornerà solo un provider che sia abilitato. Se il gps è disabilitato non lo prenderà in considerazione. La scelta ricadrà probabilmente sul network provider e userà solo quello, anche se poi vai ad abilitare il gps.

Comunque, se ciò che ti interessa è l'accuratezza, secondo me ti converrebbe lasciar perdere i criteria e richiedere la localizzazione da entrambi i provider, come nel codice che hai postato. Poi, nell'onLocationChanged, usi il location.getAccuracy() per controllare la precisione in metri della posizione ricevuta e decidere se scartarla o tenerla.  ;-)
« Ultima modifica: 15 Maggio 2012, 18:46:12 CEST da Verandi »

Offline daveblack

  • Nuovo arrivato
  • *
  • Post: 43
  • Respect: 0
    • http://www.linkedin.com/profile/view?id=155824415&trk=tab_pro
    • Mostra profilo
    • DC Hall
  • Dispositivo Android:
    Samsung Galaxy Next
  • Sistema operativo:
    Mac OSX 10.7 Lion
Re:Problema nel geolocalizzare con LocationManager
« Risposta #10 il: 24 Maggio 2012, 08:47:53 CEST »
0
ciao, io uso questo codice per recuperare latitudine e longitudine della posizione dell'utente:

Codice (Java): [Seleziona]
               


                LocationManager locManager = (LocationManager) SimpleTravelActivity.appContext.getSystemService(SimpleTravelActivity.LOCATION_SERVICE);
                Location userLoc = null;
                if(locManager.isProviderEnabled(LocationManager.GPS_PROVIDER)||locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
                        Criteria crit = new Criteria();
                        crit.setAccuracy(Criteria.ACCURACY_FINE);
                        userLoc = locManager.getLastKnownLocation(locManager.getBestProvider(crit , true));
                }
                else{
                        // DIALOG PROVIDER NOT ENABLED
                }

                Log.i("ST_INFO", "LOCATION: LATITUDE = "+userLoc.getLatitude());
                Log.i("ST_INFO", "LOCATION: LONGITUDE = "+userLoc.getLongitude());