Мое приложение проверяет в определенное время, является ли пользователь в данном местоположении. Я использую менеджера аварийных сигналов для запуска сервиса, который выполняет этот вызов:
locationManager.requestLocationUpdates(bestProvider, 0, 0, listener);
И также проверки:
locationManager.getLastKnownLocation(bestProvider);
Но у меня есть проблемы при работе физического устройства. С одной стороны, getLastKnownLocation
наиболее вероятно последнее место, GPS шел, который мог быть где угодно (т.е. это могли быть мили от текущего местоположения пользователя). Таким образом, я буду просто ожидать requestLocationUpdates
обратные вызовы, и если они не там в течение двух минут, удаляют слушателя и сдаются, правильно?
Неправильно, потому что, если местоположение пользователя уже стабильно (т.е. они недавно использовали GPS и не переместились), затем моего слушателя никогда не будут звонить, потому что местоположение не изменяется. Но GPS будет работать, пока мой слушатель не будет удален, истощая батарею...
Что правильный путь состоит в том, чтобы получить текущее местоположение, не принимая старое местоположение за текущее местоположение? Я не возражаю ожидать несколько минут.
Править: Возможно, что я неправ относительно слушателя, не позвонившего, это может просто взять немного дольше, чем я думал... Трудно сказать. Я ценил бы категорический ответ все еще.
Код может быть примерно таким:
public class MyLocation {
Timer timer1;
LocationManager lm;
public boolean getLocation(Context context)
{
lm = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListenerGps);
timer1=new Timer();
timer1.schedule(new GetLastLocation(), 20000);
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
timer1.cancel();
lm.removeUpdates(this);
//use location as it is the latest value
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
class GetLastLocation extends TimerTask {
@Override
public void run() {
lm.removeUpdates(locationListenerGps);
Location location=lm.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
//use location as we have not received the new value from listener
}
}
}
Мы запускаем прослушиватель и ждем обновления в течение некоторого времени (20 секунд в моем примере). Если мы получаем обновление в течение этого времени, мы его используем. Если мы не получаем обновления в это время, мы используем значение getLastKnownLocation и останавливаем слушателя.
Вы можете увидеть мой полный код здесь Каков самый простой и надежный способ узнать текущее местоположение пользователя на Android?
ИЗМЕНИТЬ (автор вопроса): Это большая часть ответа, но мое окончательное решение использует обработчик вместо таймера.
Если местоположение пользователя уже стабильно, то getLastKnownLocation
вернет текущее местоположение. Я бы сначала позвонил getLastKnownLocation
, посмотрел бы на метку времени (сравните Location.getElapsedRealTimeNanos ()
с SystemClock.elapsedRealTimeNanos ()
), затем зарегистрируйте слушателя слишком стар.