Frage

Ich schreibe eine Anwendung, die die Benutzer aktuellen Standort erfordert (lastknownlocation nicht sehr hilfreich sein) und zeigt eine Liste aller am nächsten gelegenen „Elementen“, um sie aus der Datenbank.

Ich habe die Feststellung der engstenen Elemente kam gut arbeiten, aber nur eine fest codiertes Breiten- und Längen Lage einstweilen verwenden, aber jetzt ist es Zeit zu implementieren, um die tatsächliche Lage zu finden.

Kann mir jemand ein Beispiel dafür, wie die App haben, die aktuelle schöne Lage im Hintergrund finden und die App warten. Ich brauche nur den Ort einmal nicht als die Person bewegt aktualisiert. Ich habe einen Ort Hörer implementiert aber ich verstehe einen GPS-Fix bekommen kann langsam sein. Ich habe andere Beispiele gesehen Verwendung letzte bekannte Position oder die Umsetzung des Standort-Listener, die jedoch laufen und aktualisieren, weiterhin als meine Aktivität die Standortkoordinaten werden muss, bevor es einfach alles, was die App abstürzt anzeigen kann. Ich brauche einen Fortschritt Dialog während seiner Suche zu zeigen.

Wie kann ich den Locationlauf einmal im Hintergrund und dann Standortaktualisierungen entfernen, sobald sie feststellt, die Lage. Ich brauche den Rest der Anwendung zu warten, bis es eine GPS-Position oder Timeout nach etwa 20-30seconds hat. Ich möchte einen ProgressDialog wie oben, damit der Benutzer weiß, dass etwas los ist, aber es hat nur die Spinn Laden Animation, um nicht einen Prozentsatz oder nichts. Wenn möglich, dass ich den Benutzer möchte in der Lage sein den Dialog abzubrechen, wenn sie krank des Wartens sind, die dann sie durch Eingabe Vorort suchen usw. statt.

Ich habe versucht, es mit Threads zu tun, aber es ist immer viel mehr kompliziert, als ich fühle es sein sollte, und immer noch nicht funktioniert trotzdem. Auf dem iPhone ist dies viel einfacher?

Kann jemand bietet eine schöne Art und Weise, dies zu tun, ich habe auf diesem meine Haare für eine Woche wurde zerreißt und es setzt mich wirklich hinter dem Zeitplan für den Rest der App Endtermin.

Zusammenfassend möchte ich:
* Aktuelle Koordinaten finden
* Status anzeigen Dialog, während sich Standort
* Have-App für erfolgreichen Standort warten kann, oder nach einer bestimmten Zeit aufgeben?
* Wenn Erfolgreich:. Entlassen Fortschritt Dialog und Verwendung Koordinaten meine andere Methoden für die Suche nach Artikel closeby läuft
* Wenn Standort kann nicht erhalten: Fortschritt Dialog und zeigt Fehlermeldung Entlassen und Benutzer zu bedienende Menü ermutigen gehen Aktivität auf Stellensuche. * Verwenden Sie diese Koordinaten, wenn der Benutzer wählt Ansicht aus dem Menü Karte, aktuelle Position auf der Karte anzuzeigen und Stifte fallen gelassen zu allen nahe gelegenen Gegenstände durch ihre Koordinaten aus der Datenbank verwendet wird.

Danke Jungs, ich hoffe, ich habe erklärt, mich gut genug. Noch Fragen einfach fragen, werde ich regelmäßig die Kontrolle zurück, wie ich bin daran interessiert, diesen Teil abgeschlossen werden. Prost

Bearbeiten
Code wie gewünscht

locationList Aktivitätsdatei

protected void onStart()
{
    super.onStart();

    // ....

    new LocationControl().execute(this);
}


private class LocationControl extends AsyncTask<Context, Void, Void>
{
    private final ProgressDialog dialog = new ProgressDialog(branchAtmList.this);

    protected void onPreExecute()
    {
        this.dialog.setMessage("Determining your location...");
        this.dialog.show();
    }

    protected Void doInBackground(Context... params)
    {
        LocationHelper location = new LocationHelper();

        location.getLocation(params[0], locationResult);

        return null;
    }

    protected void onPostExecute(final Void unused)
    {
        if(this.dialog.isShowing())
        {
            this.dialog.dismiss();
        }

        useLocation(); //does the stuff that requires current location
    }

}

public LocationResult locationResult = new LocationResult()
{
    @Override
    public void gotLocation(final Location location)
    {
        currentLocation = location;
    }
};  

LocationHelper Klasse

    package org.xxx.xxx.utils;

import java.util.Timer;
/*
imports
*/

public class LocationHelper
{
    LocationManager locationManager;
    private LocationResult locationResult;
    boolean gpsEnabled = false;
    boolean networkEnabled = false;

    public boolean getLocation(Context context, LocationResult result)
    {       
        locationResult = result;

        if(locationManager == null)
        {
            locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
        }
            //exceptions thrown if provider not enabled
            try
            {
                gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
            }
            catch (Exception ex) {}
            try
            {
                networkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
            }
            catch (Exception ex) {}

            //dont start listeners if no provider is enabled
            if(!gpsEnabled && !networkEnabled)
            {
                return false;
            }

            if(gpsEnabled)
            {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
            }
            if(networkEnabled)
            {
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListenerNetwork);
            }


            GetLastLocation();
            return true;
    }

    LocationListener locationListenerGps = new LocationListener() {
        public void onLocationChanged(Location location)
        {
            locationResult.gotLocation(location);
            locationManager.removeUpdates(this);
            locationManager.removeUpdates(locationListenerNetwork);

        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extra) {}
    };

    LocationListener locationListenerNetwork = new LocationListener() {
        public void onLocationChanged(Location location)
        {
            locationResult.gotLocation(location);
            locationManager.removeUpdates(this);
            locationManager.removeUpdates(locationListenerGps);

        }
        public void onProviderDisabled(String provider) {}
        public void onProviderEnabled(String provider) {}
        public void onStatusChanged(String provider, int status, Bundle extra) {}

    };

    private void GetLastLocation()
    {
            locationManager.removeUpdates(locationListenerGps);
            locationManager.removeUpdates(locationListenerNetwork);

            Location gpsLocation = null;
            Location networkLocation = null;

            if(gpsEnabled)
            {
                gpsLocation = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
            }
            if(networkEnabled)
            {
                networkLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
            }

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

                return;
            }

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

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

            locationResult.gotLocation(null);
    }

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

Das scheint wirklich wie ein großer Aufwand nur einmal den aktuellen Standort zu bekommen? Ich benötige keine Updates oder etwas? Gibt es nicht einen einfacheren Weg, um die Anwendung warten, bis ein Ergebnis zu haben? Ich habe auf diesem steckt schon so lange.

War es hilfreich?

Lösung

Verwenden einer AsyncTask und Verwendung sowohl network_provider sowie gps_provider , die zwei Hörer bedeutet. GPS dauert länger eine Fix zu bekommen, vielleicht manchmal eine Minute und funktioniert nur im Freien, während Netzwerk einen Ort ziemlich schnell bekommt.

Ein gutes Codebeispiel ist hier: Was ist die einfachste und robusteste ist Art und Weise des Benutzers aktuellen Standort auf Android zu bekommen?

Für AsyncTask, schauen http://developer.android.com/reference /android/os/AsyncTask.html

Es gibt auch viel Codebeispiel hier auf SO für sie, zum Beispiel hier:

Andere Tipps

ich immer noch nicht so, wie das funktioniert überhaupt, und es scheint Art und Weise komplizierter, als es sein sollte, aber bis jemand eine bessere Art, wie ich es jetzt arbeiten, haben ...

Wenn jemand über diese kommt und ein viel besseres Ergebnis sauberes suggeriert nur den aktuellen Standortkoordinaten des Benutzers erhält nur einmal dann aufhören, das wäre !!

sehr geschätzt
private LocationControl locationControlTask;
private boolean hasLocation = false;
LocationHelper locHelper;

Von onCreate () Ich nenne

locHelper = new LocationHelper();
locHelper.getLocation(context, locationResult);
locationControlTask = new LocationControl();
locationControlTask.execute(this);

Ich habe dann eine eine private Klasse LocationControl

private class LocationControl extends AsyncTask<Context, Void, Void>
    {
        private final ProgressDialog dialog = new ProgressDialog(activityname.this);

        protected void onPreExecute()
        {
            this.dialog.setMessage("Searching");
            this.dialog.show();
        }

        protected Void doInBackground(Context... params)
        {
            //Wait 10 seconds to see if we can get a location from either network or GPS, otherwise stop
            Long t = Calendar.getInstance().getTimeInMillis();
            while (!hasLocation && Calendar.getInstance().getTimeInMillis() - t < 15000) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            };
            return null;
        }

        protected void onPostExecute(final Void unused)
        {
            if(this.dialog.isShowing())
            {
                this.dialog.dismiss();
            }

            if (currentLocation != null)
            {
                useLocation();
            }
            else
            {
                //Couldn't find location, do something like show an alert dialog
            }
        }
    }

Dann wird ein locationResult ..

public LocationResult locationResult = new LocationResult()
    {
        @Override
        public void gotLocation(final Location location)
        {
            currentLocation = new Location(location);
            hasLocation = true;
        }
    };

Auch zu vermeiden Sie ziehen Ihre Haare wie ich für Alter tat erinnere mich an die locationcontrol Aufgabe zu stoppen, wenn jemand verlässt die Aktivität früh und auch Stopstelle aktualisiert, um den GPS zu stoppen ausgeführt wird, wenn sich der Benutzer entfernt. In OnStop () etwas tun, wie folgt aus:

locHelper.stopLocationUpdates();
locationControlTask.cancel(true);

Auch stopLocationUpdates in der Lage Helper-Klasse führt Folgendes aus:

public void stopLocationUpdates()
{
locationManager.removeUpdates(locationListenerGps);
locationManager.removeUpdates(locationListenerNetwork);
}

Viel Glück mit ihm, ich brauchte es ...

Statt eines AsyncTask Erstellen warum Sie keine ProgressDialog Box erstellen und auf public void gotLocation(final Location location){} entlassen? Sie können auch eine onCancelListener zum ProgressDialog Feld hinzufügen und verwerfen alle aktuellen Standortanfragen.

scroll top