Android - Надежно получая текущее местоположение

Мое приложение проверяет в определенное время, является ли пользователь в данном местоположении. Я использую менеджера аварийных сигналов для запуска сервиса, который выполняет этот вызов:

locationManager.requestLocationUpdates(bestProvider, 0, 0, listener);

И также проверки:

 locationManager.getLastKnownLocation(bestProvider);

Но у меня есть проблемы при работе физического устройства. С одной стороны, getLastKnownLocation наиболее вероятно последнее место, GPS шел, который мог быть где угодно (т.е. это могли быть мили от текущего местоположения пользователя). Таким образом, я буду просто ожидать requestLocationUpdates обратные вызовы, и если они не там в течение двух минут, удаляют слушателя и сдаются, правильно?

Неправильно, потому что, если местоположение пользователя уже стабильно (т.е. они недавно использовали GPS и не переместились), затем моего слушателя никогда не будут звонить, потому что местоположение не изменяется. Но GPS будет работать, пока мой слушатель не будет удален, истощая батарею...

Что правильный путь состоит в том, чтобы получить текущее местоположение, не принимая старое местоположение за текущее местоположение? Я не возражаю ожидать несколько минут.

Править: Возможно, что я неправ относительно слушателя, не позвонившего, это может просто взять немного дольше, чем я думал... Трудно сказать. Я ценил бы категорический ответ все еще.

8
задан noah 25 June 2010 в 18:51
поделиться

2 ответа

Код может быть примерно таким:

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?

ИЗМЕНИТЬ (автор вопроса): Это большая часть ответа, но мое окончательное решение использует обработчик вместо таймера.

4
ответ дан 5 December 2019 в 20:13
поделиться

Если местоположение пользователя уже стабильно, то getLastKnownLocation вернет текущее местоположение. Я бы сначала позвонил getLastKnownLocation , посмотрел бы на метку времени (сравните Location.getElapsedRealTimeNanos () с SystemClock.elapsedRealTimeNanos () ), затем зарегистрируйте слушателя слишком стар.

4
ответ дан 5 December 2019 в 20:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: