У меня есть код Android, который должен получить лучшее доступное местоположение БЫСТРО, от GPS, сети или любого другого. Точность менее важна, чем скорость.
Получение наилучшего доступного местоположения - действительно стандартная задача. Тем не менее, я не могу найти код для его демонстрации. Код местоположения Android ожидает, что вы укажете критерии, зарегистрируйтесь для получения обновлений и подождите - это нормально, если у вас есть подробные критерии и вы не можете ждать.
Но мое приложение должно работать немного больше, как приложение Maps, когда оно сначала находит вас - работайте с любым доступным провайдером, и просто проверьте, что местоположение не дико устарело или нулевое.
Я попытался свернуть свой собственный код, чтобы сделать это, но у меня проблемы. (Это внутри IntentService, где происходит загрузка, если это имеет значение. Я включил весь код для информации.) Что не так с этим кодом?
@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();
}
К сожалению, это находит сетевого провайдера, но только когда-либо выдает latlng null
30 раз - он, кажется, вообще не получает места. Я даже не получаю оператор журнала locationChanged
.
Это смешно, потому что из ddms я вижу вывод вроде:
NetworkLocationProvider: onCellLocationChanged [305,8580]
NetworkLocationProvider: getNetworkLocation(): returning cache location with accuracy 75.0
похоже, что у провайдера сети есть какая-то информация о местоположении, я просто не понимаю.
Может ли кто-нибудь помочь? Я думаю, что рабочий пример кода будет полезным ресурсом для сообщества Android/StackOverflow.