Ich schreibe eine App, die den aktuellen Standort des Benutzers benötigt (letzte bekannte Position wird nicht sehr hilfreich sein) und zeigt eine Liste aller aus der Datenbank entnommenen "Objekte" an.Android GPS-Ort einmal finden, Ladedialog anzeigen
Ich habe das Finden der nächsten Elemente gut funktioniert, aber nur mit einem hartcodierten Breiten- und Längengrad Ort für die Zeit, aber jetzt ist es an der Zeit, den tatsächlichen Standort zu finden.
Kann jemand ein Beispiel dafür geben, wie die App den aktuellen Standort im Hintergrund finden und die App warten lassen kann. Ich brauche den Ort nur einmal nicht aktualisiert, wenn sich die Person bewegt. Ich habe einen Standort-Listener implementiert, aber ich verstehe, dass ein GPS-Fix langsam sein kann. Ich habe andere Beispiele gesehen, die den letzten bekannten Ort verwenden oder den Lokalisierungs-Listener implementieren, der jedoch weiterläuft und aktualisiert wird, da meine Aktivität die Standortkoordinaten benötigt, bevor sie alles anzeigen kann, was gerade abstürzt. Ich muss während der Suche einen Fortschrittsdialog anzeigen.
Wie kann ich den LocationListener einmal im Hintergrund ausgeführt und dann Standort-Updates entfernen, sobald es den Speicherort findet. Ich brauche den Rest der Anwendung zu warten, bis es eine GPS-Position oder Timeout nach sagen 20-30 Sekunden hat. Ich möchte einen ProgressDialog, damit der Benutzer weiß, dass etwas läuft, aber es muss nur die drehende Lade-Animation sein, kein Prozentsatz oder so. Wenn möglich, möchte ich, dass der Benutzer in der Lage ist, den Dialog abzubrechen, wenn er es satt hat zu warten, und dann suchen kann, indem er stattdessen Vorort usw. eingibt.
Ich habe versucht, es mit Threads zu tun, aber es wird viel komplizierter als ich denke, es sollte immer noch nicht funktionieren. Auf dem iPhone ist das viel einfacher?
Kann mir jemand eine gute Möglichkeit bieten, dies zu tun, habe ich mir eine Woche lang die Haare ausgerissen und es bringt mich wirklich in Verlegenheit für den Rest des App-Abschlussdatums.
Zusammenfassend mag ich:
* aktuelle Koordinaten finden
* Status anzeigen Dialog, während ich Standort
* Haben App für erfolgreichen Standort oder gibt nach einer gewissen Zeit warten kann?
* Wenn erfolgreich: Fortschrittsdialog abbrechen und Koordinaten verwenden, um meine anderen Methoden zum Suchen von Elementen in der Nähe auszuführen.
* Wenn das Abrufen des Standorts fehlgeschlagen ist: Fortschrittsdialog abbrechen und eine Fehlermeldung anzeigen und den Benutzer ermutigen, das Menü zu verwenden, um zu Suchen Aktivität zu gehen.
* Verwenden Sie diese Koordinaten, wenn der Benutzer die Kartenansicht aus dem Menü auswählt, um den aktuellen Standort auf der Karte und die Pins aller Objekte in der Nähe anzuzeigen, indem ihre Koordinaten aus der Datenbank verwendet werden.
Danke Jungs, ich hoffe, ich habe mich gut genug erklärt. Haben Sie Fragen, fragen Sie einfach, ich werde regelmäßig nachsehen, da ich gerne diesen Teil vervollständigen möchte. Prost
EDIT
-Code als angefordert
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 eine große Anstrengung zu sein, nur um den aktuellen Standort einmal zu bekommen? Ich brauche keine Updates oder irgendetwas? Gibt es keine einfachere Möglichkeit, die Anwendung auf ein Ergebnis warten zu lassen? Ich habe mich so lange festgefahren.
http://stackoverflow.com/questions/3145089/what-is-the-simplet-and-most-robust-way-to-get-the-users-current-location-in-a-/9811633#9811633 – Rajal