Autore Topic: Geolocalizzazione e aggiornamenti  (Letto 483 volte)

Offline vise950

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 4
  • Sistema operativo:
    winsows 8.1
Geolocalizzazione e aggiornamenti
« il: 29 Dicembre 2014, 15:50:27 CET »
0
Salve ragazzi girando per la rete ho trovato un codice che restituisce la posizione in pochi secondi,il problema è che dopo aver restituito la posizione non l' aggiorna dopo un tot. di tempo

Codice (Java): [Seleziona]
import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import java.util.Timer;
import java.util.TimerTask;

public class MyLocation {
    Timer timer1;
    LocationManager lm;
    LocationResult locationResult;
    boolean gps_enabled = false;
    boolean network_enabled = false;

    public boolean getLocation(Context context, LocationResult result) {
        //I use LocationResult callback class to pass location value from MyLocation to user code.
        locationResult = result;
        if (lm == null)
            lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        //exceptions will be thrown if provider is not permitted.
        try {
            gps_enabled = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
        } catch (Exception ex) {
        }
        try {
            network_enabled = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
        } catch (Exception ex) {
        }

        //don't start listeners if no provider is enabled
        if (!gps_enabled) {
            Toast.makeText(context, "GPS non attivo", Toast.LENGTH_LONG).show();
            return false;
        }

        if (!network_enabled) {
            Toast.makeText(context, "Rete non attiva", Toast.LENGTH_LONG).show();
            return false;
        }

        if (gps_enabled) {
            lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 5, locationListenerGps);
            Log.d("UPDATE", "gps update");
        }
        if (network_enabled) {
            lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 5, locationListenerNetwork);
            Log.d("UPDATE", "network update");
        }
        timer1 = new Timer();
        timer1.schedule(new GetLastLocation(), 20000);
        return true;
    }

    public static abstract class LocationResult {
        public abstract void gotLocation(Location location);
    }

    class GetLastLocation extends TimerTask {
        @Override
        public void run() {
            lm.removeUpdates(locationListenerGps);
            lm.removeUpdates(locationListenerNetwork);

            Location net_loc = null, gps_loc = null;
            if (gps_enabled)
                gps_loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            if (network_enabled)
                net_loc = lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);

            //if there are both values use the latest one
            if (gps_loc != null && net_loc != null) {
                if (gps_loc.getTime() > net_loc.getTime())
                    locationResult.gotLocation(gps_loc);
                else
                    locationResult.gotLocation(net_loc);
                return;
            }

            if (gps_loc != null) {
                locationResult.gotLocation(gps_loc);
                return;
            }
            if (net_loc != null) {
                locationResult.gotLocation(net_loc);
                return;
            }
            locationResult.gotLocation(null);
        }
    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerNetwork);
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    };


    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location) {
            timer1.cancel();
            locationResult.gotLocation(location);
            lm.removeUpdates(this);
            lm.removeUpdates(locationListenerGps);
        }

        public void onProviderDisabled(String provider) {
        }

        public void onProviderEnabled(String provider) {
        }

        public void onStatusChanged(String provider, int status, Bundle extras) {
        }
    };
}

Guardando nelle Api ho visto che ci sono due valori che aggiornano la posizione ma nel mio codice non funziona.
Codice (Java): [Seleziona]
public void requestLocationUpdates (String provider, long minTime, float minDistance, LocationListener listener)
minTime minimum time interval between location updates, in milliseconds
minDistance     minimum distance between location updates, in meters

Codice (Java): [Seleziona]
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 5, locationListenerGps);
dove sbaglio?

Offline arlabs

  • Utente normale
  • ***
  • Post: 430
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Geolocalizzazione e aggiornamenti
« Risposta #1 il: 31 Dicembre 2014, 10:32:51 CET »
0
la removeUpdates deregistra i listener, quindi non ti arrivano più aggiornamenti.

Questo codice è sembra scritto per ottenere una sola posizione, il prima possibile (in max 20 sec) e senza interesse alla precisione

- Si registra i listener (uno GPS ed uno NETWORK)
- Programma un TimerTask a 20 secondi
- Attende i listener
- Il primo che arriva, annulla il timer, deregistra entrambi e chiama la callback
- Se in 20 secondi, nessuno dei 2 listener è chiamato, interviene il TimerTask che deregistra i listener, prende l'ultima posizione conosciuta (getLastKnownLocation) e chiama la callback.

Ciao.