Ich habe einige Android-Code, der den besten verfügbaren Standort SCHNELL bekommen muss, von GPS, Netzwerk oder was auch immer verfügbar ist. Genauigkeit ist weniger wichtig als Geschwindigkeit.Android: Holen Sie sich den aktuellen Standort von den besten verfügbaren Anbieter
Den besten verfügbaren Standort zu bekommen ist sicherlich eine Standardaufgabe. Aber ich kann keinen Code finden, um es zu demonstrieren. Der Android-Standortcode erwartet, dass Sie Kriterien angeben, sich für Updates registrieren und warten - das ist in Ordnung, wenn Sie detaillierte Kriterien haben und es Ihnen nichts ausmacht, darauf zu warten.
Aber meine App muss ein bisschen mehr funktionieren wie die Google Maps App, wenn sie Sie zuerst findet - arbeiten Sie von jedem verfügbaren Anbieter, und prüfen Sie nur, ob der Standort nicht veraltet oder null ist.
Ich habe versucht, meinen eigenen Code zu rollen, aber ich habe Probleme. (Es befindet sich in einem IntentService, in dem ein Upload stattfindet, wenn das einen Unterschied macht. Ich habe den gesamten Code für Informationen hinzugefügt.) Was ist mit diesem Code falsch?
@Override
protected void onHandleIntent(Intent arg0) {
testProviders();
doUpload();
}
private boolean doUpload() {
int j = 0;
// check if we have accurate location data yet - wait up to 30 seconds
while (j < 30) {
if ((latString == "") || (lonString == "")) {
Log.d(LOG_TAG, "latlng null");
Thread.sleep(1000);
j++;
} else {
Log.d(LOG_TAG, "found lat " + latString + " and lon " + lonString);
break;
}
//do the upload here anyway, with or without location data
//[code removed for brevity]
}
public boolean testProviders() {
Log.e(LOG_TAG, "testProviders");
String location_context = Context.LOCATION_SERVICE;
locationmanager = (LocationManager) getSystemService(location_context);
List<String> providers = locationmanager.getProviders(true);
for (String provider : providers) {
Log.e(LOG_TAG, "registering provider " + provider);
listener = new LocationListener() {
public void onLocationChanged(Location location) {
// keep checking the location - until we have
// what we need
//if (!checkLoc(location)) {
Log.e(LOG_TAG, "onLocationChanged");
locationDetermined = checkLoc(location);
//}
}
public void onProviderDisabled(String provider) {
}
public void onProviderEnabled(String provider) {
}
public void onStatusChanged(String provider, int status,
Bundle extras) {
}
};
locationmanager.requestLocationUpdates(provider, 0,
0, listener);
}
Log.e(LOG_TAG, "getting updates");
return true;
}
private boolean checkLoc(Location location) {
float tempAccuracy = location.getAccuracy();
int locAccuracy = (int) tempAccuracy;
Log.d(LOG_TAG, "locAccuracy = " + locAccuracy);
if ((locAccuracy != 0) && (locAccuracy < LOCATION_ACCURACY)) {
latitude = location.getLatitude();
longitude = location.getLongitude();
latString = latitude.toString();
lonString = longitude.toString();
return true;
}
return false;
}
public void removeListeners() {
// Log.e(LOG_TAG, "removeListeners");
if ((locationmanager != null) && (listener != null)) {
locationmanager.removeUpdates(listener);
}
locationmanager = null;
// Log.d(LOG_TAG, "Removed " + listener.toString());
}
@Override
public void onDestroy() {
super.onDestroy();
removeListeners();
}
Leider ist dies findet den Netzbetreiber, sondern immer nur gibt latlng null
30 mal - es scheint, nie überhaupt eine Stelle zu bekommen. Ich bekomme nie eine Log-Anweisung von locationChanged
.
Es ist schon komisch, denn von DDMs kann ich eine Ausgabe wie sehen:
NetworkLocationProvider: onCellLocationChanged [305,8580]
NetworkLocationProvider: getNetworkLocation(): returning cache location with accuracy 75.0
vorzuschlagen scheinen, dass der Netzbetreiber hat schließlich einige Informationen über den Standort haben, ich bin es einfach nicht zu bekommen.
Kann jemand helfen? Ich denke, Code für Arbeitsbeispiele wäre eine nützliche Ressource für die Android/StackOverflow-Community.
Vielleicht kann mein Codebeispiel helfen http://stackoverflow.com/ Fragen/3145089/was-ist-der-einfachste-und-robust-Weg-zu-erhalten-die-Benutzer-aktuelle-Standort-in-einem/3145655 # 3145655 – Fedor