Autore Topic: Problema aggiornamento localizzazione  (Letto 1908 volte)

Offline pietptr

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy S2
  • Sistema operativo:
    Windows 7
Problema aggiornamento localizzazione
« il: 22 Gennaio 2014, 19:39:42 CET »
0
Salve a tutti. E la prima volta che scrivo, anche se molto spesso trovo argomenti molto interessanti.
volevo sottoporvi un problema che ho riscontrato nel codice che sto utilizzando per una navigazione dal punto in cui si trova il dispositivo a un punto prestabilito. Fino a qualche settimana fa andava una meraviglia, ma da qualche giorno mi sono accorto che non rileva la mia posizione, ma  il punto di partenza resta sempre lo stesso (Cioè l'ultimo che ha rilevato bene). il codice l'ho trovato in un tutorial:

Codice (Java): [Seleziona]
import android.app.AlertDialog;
import android.app.Service;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;
import android.provider.Settings;
import android.util.Log;

import com.google.android.gms.location.LocationListener;

public class GPSTracker extends Service implements LocationListener, android.location.LocationListener {
         
    private final Context mContext;
 
    // flag for GPS status
    boolean isGPSEnabled = false;
 
    // flag for network status
    boolean isNetworkEnabled = false;
 
    boolean canGetLocation = false;
 
    Location location; // location
   
    String towers;
    double latitude; // latitude
    double longitude; // longitude
 
    // The minimum distance to change Updates in meters
    private static final long MIN_DISTANCE_CHANGE_FOR_UPDATES = 10; // 10 meters
 
    // The minimum time between updates in milliseconds
    private static final long MIN_TIME_BW_UPDATES = 1000 * 60 * 1; // 1 minute
 
    // Declaring a Location Manager
    protected LocationManager locationManager;
 
    public GPSTracker(Context context) {
        this.mContext = context;
        getLocation();
    }
    public Location getLocation() {
        try {
            locationManager = (LocationManager) mContext
                    .getSystemService(LOCATION_SERVICE);
 
            // getting GPS status
            isGPSEnabled = locationManager
                    .isProviderEnabled(LocationManager.GPS_PROVIDER);
 
            // getting network status
            isNetworkEnabled = locationManager
                    .isProviderEnabled(LocationManager.NETWORK_PROVIDER);
 
            if (!isGPSEnabled && !isNetworkEnabled) {
                // no network provider is enabled
            } else {
                this.canGetLocation = true;
                // First get location from Network Provider
                if (isNetworkEnabled) {
                    locationManager.requestLocationUpdates(
                            LocationManager.NETWORK_PROVIDER,
                            MIN_TIME_BW_UPDATES,
                            MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                    Log.d("Network", "Network");
                    if (locationManager != null) {
                        Criteria crit = new Criteria();
                        towers=locationManager.getBestProvider(crit, false);
                        location = locationManager
                                .getLastKnownLocation(towers);
                        if (location != null) {
                               
                            latitude = location.getLatitude();
                            longitude = location.getLongitude();
                        }
                    }
                }
                // if GPS Enabled get lat/long using GPS Services
                if (isGPSEnabled) {
                    if (location == null) {
                        Criteria crit = new Criteria();
                        towers=locationManager.getBestProvider(crit, false);
                        locationManager.requestLocationUpdates(
                                LocationManager.GPS_PROVIDER,
                                MIN_TIME_BW_UPDATES,
                                MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                        Log.d("GPS Enabled", "GPS Enabled");
                        if (locationManager != null) {
                               
                            location = locationManager
                                    .getLastKnownLocation(towers);
                            if (location != null) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                            }
                        }
                    }
                }
            }
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return location;
    }
    @Override
    public void onLocationChanged(Location location) {
    }
 
    @Override
    public void onProviderDisabled(String provider) {
    }
 
    @Override
    public void onProviderEnabled(String provider) {
    }
 
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
 
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    /**
     * Function to get latitude
     * */

    public double getLatitude(){
        if(location != null){
            latitude = location.getLatitude();
        }
         
        // return latitude
        return latitude;
    }
     
    /**
     * Function to get longitude
     * */

    public double getLongitude(){
        if(location != null){
            longitude = location.getLongitude();
        }
         
        // return longitude
        return longitude;
    }
    /**
     * Function to check if best network provider
     * @return boolean
     * */

    public boolean canGetLocation() {
        return this.canGetLocation;
    }
     
    /**
     * Function to show settings alert dialog
     * */

    public void showSettingsAlert(){
        AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
     
        // Setting Dialog Title
        alertDialog.setTitle("GPS is settings");
 
        // Setting Dialog Message
        alertDialog.setMessage("GPS is not enabled. Do you want to go to settings menu?");
 
        // Setting Icon to Dialog
        //alertDialog.setIcon(R.drawable.delete);
 
        // On pressing Settings button
        alertDialog.setPositiveButton("Settings", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog,int which) {
                Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                mContext.startActivity(intent);
            }
        });
 
        // on pressing cancel button
        alertDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
            dialog.cancel();
            }
        });
 
        // Showing Alert Message
        alertDialog.show();
    }
    /**
     * Stop using GPS listener
     * Calling this function will stop using GPS in your app
     * */

    public void stopUsingGPS(){
        if(locationManager != null){
            locationManager.removeUpdates(GPSTracker.this);
        }      
    }}

e questa è la mia Activity:

Codice (Java): [Seleziona]
import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.Toast;
import certosa.GPSTracker;

public class IndicazioniStradali extends Activity {
        ImageButton b1;
        ImageButton b2;
        //GPSTracker class
        GPSTracker gps;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_indicazioni_stradali);
                final double lat = getIntent().getDoubleExtra("passlat", 0);
                final double lon = getIntent().getDoubleExtra("passlon", 0);
                 b2 = (ImageButton) findViewById(R.id.imageButton2);
               b1 = (ImageButton) findViewById(R.id.imageButton1);
               createListeners();
                // show location button click event
                b2.setOnClickListener(new View.OnClickListener() {
                   
                    @Override
                    public void onClick(View arg0) {      
                        // create class object
                        gps = new GPSTracker(IndicazioniStradali.this);

                        // check if GPS enabled      
                        if(gps.canGetLocation()){
                           
                            double latitude = gps.getLatitude();
                            double longitude = gps.getLongitude();
                            Intent navigation = new Intent(
                                                Intent.ACTION_VIEW,
                                                Uri.parse("http://maps.google.com/maps?saddr="+latitude+","+longitude+" &daddr="+lat+", "+lon));
                                startActivity(navigation);
                           
                            // \n is for new line
                            Toast.makeText(getApplicationContext(), "Your Location is - \nLat: " + latitude + "\nLong: " + longitude, Toast.LENGTH_LONG).show();  
                        }else{
                            // can't get location
                            // GPS or Network is not enabled
                            // Ask user to enable GPS/network in settings
                                Toast.makeText(getApplicationContext(),"Impossibile trovare la posizione", Toast.LENGTH_LONG).show();
                            gps.showSettingsAlert();
                        }
                       
                    }
                });
        }
        public void createListeners(){
                b1.setOnClickListener(new OnClickListener(){
                        public void onClick (View v){
                                MezzipubbliciSanDomenicoMaggiore(2);
                        }
                });

        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.indicazioni_stradali, menu);
                return true;
        }
        private void MezzipubbliciSanDomenicoMaggiore (int buttonNum){
                Intent intent= new Intent (this, MezziPubblici.class);
                intent.putExtra("BUTTON NUMBER",buttonNum);
                startActivity(intent);
        }
}

qualcuno ha un'idea di quale potrebbe essere il problema??
Ringrazio in anticipo.
« Ultima modifica: 23 Gennaio 2014, 00:07:26 CET da pietptr »

Offline 1diaboliko84

Re:Problema aggiornamento localizzazione
« Risposta #1 il: 03 Febbraio 2014, 13:35:01 CET »
0
mi accodo alla discussione.
Ho il tuo stesso problema. anche io utilizzo la classe GPSTracker trovata in giro sul web.
La posizione che mi ritorna non è quella attuale, ma l'ultima che è riuscito a trovarsi. Il getLastLocation mi ritorna una posizione diversa da quella che poi realmente visualizzo sulla mappa abilitando il map.setMyLocationEnabled(true)


Offline crc_error

  • Utente junior
  • **
  • Post: 85
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Windows 8, Ubuntu 12
Re:Problema aggiornamento localizzazione
« Risposta #2 il: 03 Febbraio 2014, 14:24:23 CET »
0
Ciao! Ho dato una rapida occhiata al codice che hai postato e credo che il problema del mancato aggiornamento sia in questa parte:


Codice (Java): [Seleziona]
@Override    
public void onLocationChanged(Location location) {
        // è qui che il location manager manda gli aggiornamenti della posizione.
        // se fai un:
        Log.d("app", "lat: "+location.getLatitude() + " | lon:" + location.getLongitude() + " | speed:" + location.getSpeed());
       // dovresti veder aggiornarsi i valori in base alla tua pos e velocità
}





Offline 1diaboliko84

Re:Problema aggiornamento localizzazione
« Risposta #3 il: 03 Febbraio 2014, 15:03:32 CET »
0
Ciao crc_error, anche utilizzando una variabile e salvando la variazione della location come nell'esempio, il risultato non cambia. Mi viene visualizzata sempre la vecchia posizione conosciuta, diversa da quella mostrata sulla mappa con map.setMyLocationEnabled(true);

Codice (Java): [Seleziona]
@Override
    public void onLocationChanged(Location _location) {
        location = _location;
        if (location != null) {
            latitude = location.getLatitude();
            longitude = location.getLongitude();
        }
    }

Offline crc_error

  • Utente junior
  • **
  • Post: 85
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Windows 8, Ubuntu 12
Re:Problema aggiornamento localizzazione
« Risposta #4 il: 03 Febbraio 2014, 15:10:26 CET »
0
Strano, che non aggiorni..
se metti il codice che ho postato sopra, nel onLocationChanged e lanci la app, nella console di log scrive qualcosa?

Offline 1diaboliko84

Re:Problema aggiornamento localizzazione
« Risposta #5 il: 03 Febbraio 2014, 15:12:18 CET »
0
non metto in dubbio che non scriva qualcosa.
Il problema è se domani provi a riutilizzarla, molto probabilmente ti riporterà la posizione in cui ti trovi ora...nonostante tu sia altrove

Offline crc_error

  • Utente junior
  • **
  • Post: 85
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Windows 8, Ubuntu 12
Re:Problema aggiornamento localizzazione
« Risposta #6 il: 03 Febbraio 2014, 15:15:21 CET »
0
No, non dovrebbe.
Non gli stai chiedendo la lastposition, ma una nuova posizione, il onLocationChanged viene chiamato ogni volta che c'è una nuova posizione, al max puoi verificare l'accuratezza, la data della posizione ecc.. e nel caso scartarla.

ps. scusa per i font, ci rinuncio, ogni volta con la risposta rapida mi fa così..

Offline pietptr

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    galaxy S2
  • Sistema operativo:
    Windows 7
Re:Problema aggiornamento localizzazione
« Risposta #7 il: 04 Febbraio 2014, 13:08:02 CET »
0
Ciao crc_error, e grazie per la tua risposta.
Scusa, ma non ho ancora provato a mettere in pratica il tuo consiglio perché ho installato l'app su un nuovo dispositivo, e sembra che stia funzionando, anche se devo ancora provarci in un altro posto per esserne certo.
Forse sara solo un problema di dispositivo, o magari ha bisogno di troppo tempo prima che il gps riesca a trovare la reale posizione del telefono, è possibile?
Cmq proverò oggi se posso e vi faro sapere.

grazie.

Offline crc_error

  • Utente junior
  • **
  • Post: 85
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    LG-P500
  • Sistema operativo:
    Windows 8, Ubuntu 12
Re:Problema aggiornamento localizzazione
« Risposta #8 il: 04 Febbraio 2014, 16:11:49 CET »
0
Ciao, ho dato una occhiata alla classe e a quello che deve fare, ma non riesco a capire come possa funzionare bene..
Non mi sembra il sistema giusto..  ;)
Sull'altro telefono funziona perchè probabilmente ai attivato qualche altra app che ha calcolato una posizione più recente.

Con la quella classe che implementi, in pratica ti limiti a prendere le ultime coordinate registrate nel dispositivo, senza un controllo sulla data della posizione o sulla sua accuratezza.
Inoltre attivi dei listener per ricevere una posizione aggiornata che non verrà mai usata..  ???

Io modificherei la classe per in modo che prima faccia
 - un getLastKnownLocation(),
 - un controllo sulla posizione
  - se la posizione è aggiornata: ritorno le coordinate.
  - altrimenti attivo i listener
     - se la posizione ricevuta è ok spengo i listener e la ritorno
     - altrimenti la scarto e ne aspetto una ok

una cosa così

Codice (Java): [Seleziona]
        Location loc = new Location("posizione_user");
        boolean net_ok = false, gps_ok = false;
        long range = 300000 // 5 min
        int valore_massimo = vedi tu.. 30 p.e.
        double latitude, longitude;

        loc = network.lastKnowLocation();
        if((loc.getAccuracy > 1 && loc.getAccuracy < valore_massimo) && (loc.getTime() + range) >= data di sistema in UTC)
          latitude = loc.getLatitude();
          longitude = loc.getLongitude();
          return;
        }
       
        // provo col gps
        loc.reset();
        loc.gps.lastKnowLocation();
        if((loc.getAccuracy > 1 && loc.getAccuracy < valore massimo) && (loc.getTime() + range) >= data di sistema in UTC)
          latitude = loc.getLatitude();
          longitude = loc.getLongitude();
          return;
        }      
       
        //attivo il listener sul network e sul gps
       
        //questo:      
       locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
        //e questo:
       locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, MIN_TIME_BW_UPDATES, MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
       



        @Override
        public void onLocationChanged(Location location) {
                // qui è dove ti viene inviata la nuova posizione mandata dal metodo: requestLocationUpdates();
                // per vedere da quale provider (network o gps) arriva hai il metodo: .getProvider()
                // è qua che devi mettere:
                if (location != null) {
                        if((loc.getAccuracy > 1 && loc.getAccuracy < valore massimo) && (loc.getTime() + range) >= data di sistema in UTC) {
                                latitude = location.getLatitude();
                                longitude = location.getLongitude();
                               
                                //le posizioni sono ok. Ora uso removeUpdate per togliere i listener sulla pos via GPS e network.
                               
                        }
                }
        }

Ciao
« Ultima modifica: 04 Febbraio 2014, 16:15:04 CET da crc_error, Reason: Modificato l\'itagliano :D »

Offline GabMarioPower

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 606
  • Respect: +152
    • Github
    • Google+
    • gabrielemariotti
    • GabMarioPower
    • Mostra profilo
  • Play Store ID:
    GAB+MARIO+DEV
  • Sistema operativo:
    Ubuntu 14.04 , Win 10
Re:Problema aggiornamento localizzazione
« Risposta #9 il: 04 Febbraio 2014, 17:52:22 CET »
+1
Non sono entrato nel merito del codice, ma Google ha cambiato completamente  la logica della localizzazione negli ultimi mesi attraverso il Fused location provider.

https://developer.android.com/google/play-services/location.html
https://developer.android.com/training/location/retrieve-current.html
https://developer.android.com/training/location/receive-location-updates.html

Offline raptuz31

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus S
  • Sistema operativo:
    Windows 8.1
Re:Problema aggiornamento localizzazione
« Risposta #10 il: 07 Marzo 2014, 15:28:57 CET »
0
Salve, mi aggrego a questo post in quanto anch'io ricontro lo stesso problema.
Ho provato a seguire il tutorial di google e non viene mai attivato l'onLocationChanged

Posto il codice dell'activity di esempio che ho scritto:
Codice (Java): [Seleziona]
package com.example.locationupdates;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesClient;
import com.google.android.gms.location.LocationClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;

public class MainActivity extends FragmentActivity implements OnClickListener, GooglePlayServicesClient.ConnectionCallbacks, GooglePlayServicesClient.OnConnectionFailedListener, LocationListener{

        private static final int UPDATE_INTERVAL = 5000;
        private static final int FASTEST_INTERVAL = 1000;
       
        LocationRequest mLocationRequest;
        boolean mUpdatesRequested;
        private SharedPreferences mPrefs;
        private Editor mEditor;
        private LocationClient mLocationClient;
        private Button btn;
                       
        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);
                btn = (Button)findViewById(R.id.button1);
                btn.setOnClickListener(this);
                mLocationRequest = LocationRequest.create();
                mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
                mLocationRequest.setInterval(UPDATE_INTERVAL);
                mLocationRequest.setFastestInterval(FASTEST_INTERVAL);
               
                mPrefs = getSharedPreferences("SaredPreferences", Context.MODE_PRIVATE);
                mEditor = mPrefs.edit();
               
                mLocationClient = new LocationClient(this, this, this);
                mUpdatesRequested = false;
        }

        @Override
        protected void onPause() {
                mEditor.putBoolean("KEY_UPDATES_ON", mUpdatesRequested);
                super.onPause();
        }

        @Override
        public void onClick(View arg0) {
                final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );

            if (!manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
                buildAlertMessageNoGps();
            }else{
                        Location current = mLocationClient.getLastLocation();
                        if(current!=null){
                                String msg = "Current location: " + Double.toString(current.getLatitude()) + "," + Double.toString(current.getLongitude());
                                Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
                        }else{
                                mLocationClient.requestLocationUpdates(mLocationRequest, this);
                        }
            }
        }
       
        private void buildAlertMessageNoGps() {
            final AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("GPS non attivo, attivarlo?")
                   .setCancelable(false)
                   .setPositiveButton("Sì", new DialogInterface.OnClickListener() {
                       public void onClick(final DialogInterface dialog, final int id) {
                           startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
                       }
                   })
                   .setNegativeButton("No", new DialogInterface.OnClickListener() {
                       public void onClick(final DialogInterface dialog, final int id) {
                            dialog.cancel();
                       }
                   });
            final AlertDialog alert = builder.create();
            alert.show();
        }
       
        @Override
        protected void onResume() {
                super.onResume();
                if(mPrefs.contains("KEY_UPDATES_ON")){
                        mUpdatesRequested = mPrefs.getBoolean("KEY_UPDATES_ON", false);
                }else{
                        mEditor.putBoolean("KEY_UPDATES_ON", false);
                        mEditor.commit();
                }
        }

        @Override
        protected void onStart() {
                super.onStart();
                mLocationClient.connect();
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
                // Inflate the menu; this adds items to the action bar if it is present.
                getMenuInflater().inflate(R.menu.main, menu);
                return true;
        }

        @Override
        public void onConnectionFailed(ConnectionResult arg0) {
                // TODO Auto-generated method stub
               
        }

        @Override
        public void onConnected(Bundle arg0) {
                Toast.makeText(this, "Connected", Toast.LENGTH_SHORT).show();
                if(mUpdatesRequested){
                        mLocationClient.requestLocationUpdates(mLocationRequest, this);
                }
        }

        @Override
        protected void onStop() {
                if(mLocationClient.isConnected()){
                        mLocationClient.removeLocationUpdates(this);
                }
                mLocationClient.disconnect();
                super.onStop();
        }

        @Override
        public void onDisconnected() {
                Toast.makeText(this, "Disconnect", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onLocationChanged(Location location) {
                String msg = "Updated Location: " + Double.toString(location.getLatitude()) + "," + Double.toString(location.getLongitude());
                Toast.makeText(this, msg, Toast.LENGTH_SHORT).show();
        }

}