Android - надежное получение текущего местоположения - PullRequest
8 голосов
/ 25 июня 2010

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

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

А также проверяет:

 locationManager.getLastKnownLocation(bestProvider);

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

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

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

РЕДАКТИРОВАТЬ: Возможно, я ошибаюсь из-за того, что слушатель не вызывается, это может занять немного больше времени, чем я думал ... Трудно сказать. Я был бы признателен за окончательный ответ.

Ответы [ 2 ]

4 голосов
/ 26 июня 2010

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

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?

РЕДАКТИРОВАТЬ (по asker): Это большая часть ответа, но мое окончательное решение использует Обработчик вместо таймера.

4 голосов
/ 25 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...