Страницы

Поиск по вопросам

суббота, 7 декабря 2019 г.

Получение местоположения пользователя

#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); Observable goodEnoughQuicklyOrNothingObservable = 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 не тратиться время на поиск спутников.

Комментариев нет:

Отправить комментарий