#android #gps #карты
При запуске приложения требуется получить местоположение пользователя на карте. Погуглив и посмотрев в книге, единственное, что я нашел — это использовать слушатель смены расстояния: LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, new LocationListener() { @Override public void onLocationChanged(Location location) { //Получаю местоположение и отписываюсь locationManager.removeUpdates(this); ... } ... } Такой способ не всегда работает. Иногда приложение ждет 10 секунд-2 минуты, прежде чем слушатель сработает. Иногда просто не срабатывает (если телефон не двигается). Есть какая-то 100% работающая альтернатива запросить текущее расстояние (при условия нормальной работы GPS), а не ждать ответа в слушатель изменения?
Ответы
Ответ 1
Почему вы запрашиваете в провайдере именно GPS_PROVIDER? GPS долго прогревается при холодном старте и из-за этого возникают задержки в 20-120 секунд. Если использовать координаты сети/Wi-Fi, то локацию можно получить почти моментально. Попробуйте reactive-location, там есть пример получения локации с таймаутом, получится хороший флоу для Вашего случая: LocationRequest req = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setExpirationDuration(5000) .setInterval(1000); ObservablegoodEnoughQuicklyOrNothingObservable = new ReactiveLocationProvider(getContext()) .getUpdatedLocation(req) .filter(location -> location.getAccuracy() < 50) // с точностью до 50 метров .timeout(5, TimeUnit.SECONDS, Observable.just(null), AndroidSchedulers.mainThread()) .first() .observeOn(AndroidSchedulers.mainThread()); Subscription subscription = goodEnoughQuicklyOrNothingObservable .subscribe(location -> { if (location == null) { // не удалось получить координаты, // требуется ввод вручную } else { // получили координаты } }, Timber::e); Ответ 2
Спустя неделю поисков и вопроса на enSO и ruSO, я пришел к варанту, что альтернатив - нет. Местоположение можно определить только с помощью LocationManager.requestLocationUpdates и получить последнее местоположение, которое запомнил телефон методом FocusedLocationProviderApi. Как альтернативу, можно предложить пользователю выбрать местоположение через маркер или ввести вручную. В этом помогут автоввод местоположения и определение местоположения через координаты.Ответ 3
В качестве альтернатив можно предложить разве что ручной ввод местоположения. Еще было бы хорошо требовать от пользователя включения Wi-Fi, для более точного позиционирования. Да и получение координат через Wi-Fi/A-GPS будет работать гораздо быстрее - моментально даже. Ведь в отличии от GPS не тратиться время на поиск спутников.
Комментариев нет:
Отправить комментарий