Android: requestLocationUpdates обновляет местоположение не чаще, чем каждые 45 секунд

Справочная информация

Я пишу приложение для Android, основная функция которого - отслеживание местоположения пользователя и создание предупреждений, когда пользователь приближается к некоторой точке. Поэтому мне нужно регулярно обновлять местоположение пользователя, и эти интервалы должны уменьшаться по мере приближения пользователя к цели. Поэтому, когда пользователь находится в пределах, скажем, 1 км от цели, я хочу, чтобы местоположение обновлялось каждые 20 секунд и так далее, пока пользователь не появится.

Проблема

Когда я тестирую ( provider = LocationManager.NETWORK_PROVIDER ), вызов requestLocationUpdates (provider, minTime, minDistance, locationListener) с любым minTime <45000 имеет тот же эффект, что и minTime = 45000 , т.е. я получаю обновления с интервалом ровно 45 секунд.
Я знаю, что параметр минимального времени - это всего лишь «подсказка», но мое приложение не воспринимает ее как подсказку. Я получаю обновления с указанным интервалом, пока этот интервал не станет меньше 45 секунд. Кажется, что минимальное время в 45 секунд между обновлениями местоположения жестко запрограммировано в Android, но это было бы странно. Кроме того, я никогда раньше не слышал об этой проблеме, и мне не удалось найти ее здесь, в Stackoverflow.

Поскольку я не могу получать частые обновления, мой обходной путь (на данный момент) заключается в том, чтобы вручную вызывать requestLocationUpdates всякий раз, когда требуется новое местоположение, а затем просто использовать первое доступное местоположение. Чтобы делать это с небольшими интервалами, я использую handler.postDelayed (myRunnable, updateInterval) для задержки вызовов, а затем myRunnable выполняет вызов requestLocationUpdates . Однако этот метод работает только около 50 (очевидно, случайных) процентов времени.

Кто-нибудь знает о проблеме и есть ли способ ее исправить? Или мой единственный вариант - установить minTime = 0 и просто надеяться на лучшее?

Исходный код

Вот исходный код для myRunnable, чей метод run () Я регулярно звоню вручную с помощью обработчика .postDelayed (myRunnable, updateInterval) :

public class MyRunnable implements Runnable {
    private LocationManager manager;
    private LocationListener listener;

    @Override
    public void run() {
        // This is called everytime a new update is requested
        // so that only one request is running at a time.
        removeUpdates();

        manager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

        listener = new LocationListener() {
            @Override
            public void onLocationChanged(Location loc) {
                location = loc;
                latitude = loc.getLatitude();
                longitude = loc.getLongitude();
                accuracy = Math.round(loc.getAccuracy());

                handler.sendMessage(Message.obtain(handler, KEY_MESSAGE_LOCATION_CHANGED));

                checkForArrival();
            }

            // Other overrides are empty.
        };

        if(!arrived)
            manager.requestLocationUpdates(provider, updateInterval, 0, listener);
    }

    /**
     * Removes location updates from the LocationListener.
     */
    public void removeUpdates() {
        if(!(manager == null || listener == null))
            manager.removeUpdates(listener);
    }

    // Another method for "cleaning up" when the user has arrived.
}


А вот мой обработчик :

handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch(msg.what) {
            case KEY_MESSAGE_LOCATION_CHANGED:
                if(myRunnable != null) {
                    myRunnable.removeUpdates();
                    handler.postDelayed(myRunnable, updateInterval);
                }
                break;
            }
        }
    };


Дополнительная информация

Все обновление местоположения выполняется в сервисе.

Я читал этот документ несколько раз, искал проблему в Google и пробовал другие обходные пути. Ничто так не делает.

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

Любая помощь будет очень благодарна!

23
задан stemadsen 5 March 2012 в 20:10
поделиться