Фон
Я пишу приложение для 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()
метод я регулярно вызываю с помощью handler.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
:
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 решил проблему и попробовал различные другие обходные пути.Ничто не делает этого.
Я вычеркнул эту чертову штуку, и единственная захватывающая вещь, которую стоит увидеть - это большой жирный "игнорирование" моих частых запросов на определение местоположения.Вызываются все правильные методы.
Любая помощь будет очень оценена!