- Телефон неправильно определяет местоположение — что делать?
- Почему телефон неточно определяет местоположение?
- Что делать, если телефон неправильно определяет местоположение?
- Как увеличить точность с помощью настроек местоположения?
- Сброс данные A-GPS
- Проверка работы GPS в телефоне
- Простой способ добавить геолокацию в свой проект для Android
- Глубокое погружение в определение местоположения
- Покажи мне код!
- Что оно делает на самом деле?
- Теперь у вас есть код, давайте подробнее рассмотрим его
- Свежесть — значит никогда не ждать
- Используйте Intent’ы для получения обновлений местоположения
- Получение данных во время автономной работы
- Оптимизация времени работы аккумулятора: умные сервисы и использование состояния устройства для переключения ресиверов
- Мониторинг состояния аккумулятора для уменьшения функциональности и экономии энергии
Телефон неправильно определяет местоположение — что делать?
Советы и причины, из-за которых смартфон некорректно определяет местоположение.
Неточное местоположение на телефоне может говорить как о неправильной настройке геолокации, так и о неисправности GPS-приемника. Расскажем, что делать, если телефон неправильно определяет местоположение.
Почему телефон неточно определяет местоположение?
Неточное определение местоположения может возникнуть из-за временных факторов, к которым относятся следующие особенности:
- Наличие вокруг устройства высотных зданий, а также высокая плотность застройки в районе. Крыши и стены могут препятствовать сигналу GPS, поэтому местоположение будет определяться со значительной погрешностью.
- Сильная облачность.
- Точность геолокации снижается из-за туннелей, эстакад, лифтов а также в горной местности.
- Если на телефон надет металлический или магнитный чехол, а владелец использует магнитную подставку для мобильного устройства, оно может неправильно определять местоположение (крайне редкое явление).
Проверить, корректно ли работает определение местоположения телефона, можно в ясный день на относительно открытой местности. Вокруг не должно быть высотных зданий или деревьев с широкими лиственными кронами. Если точность повысилась, значит смартфон определяет локацию корректно. Если нет, придется воспользоваться советами, описанными ниже.
Что делать, если телефон неправильно определяет местоположение?
Если неточное местоположение не вызвано неполадками с GPS-приемников, корректную работу устройства можно вернуть самостоятельно. В первую очередь, необходимо попробовать выполнить базовые действия, которые в большинстве случаев возвращают точность геолокации:
- Перезагрузить устройство.
- Перезагрузить приложение, которое испытывает проблемы с определением геолокации.
- Обновить ПО, если на телефоне доступны свежие обновления. Найти их можно в настройках смартфона.
- Воспользоваться помощью антивирусной программы, чтобы исключить негативное воздействие вирусов на работу GPS.
- Убедиться, что на телефоне отключен режим энергосбережения.
- Отключить все приложения-оптимизаторы, так как они часто блокируют работу по отслеживанию местоположения.
- Сбросить телефон до заводских настроек. К этому пункту нужно обращаться в крайнем случае, если другие советы не улучшили ситуацию.
Если проблемы с определением местоположения испытывает конкретное приложение, необходимо проверить его разрешения. Для этого нужно найти раздел «Разрешения» в настройках телефона, выбрать нужное приложение и разрешить ему определять местоположение. Кроме того, в меню этого разрешения необходимо выбрать пункт «Разрешить в любом случае».
Как увеличить точность с помощью настроек местоположения?
Точность отслеживания геолокации можно увеличить, выбрав определенные настройки в разделе «Местоположение». В зависимости от модели телефона, эти настройки могут выглядеть по-разному, поэтому перечислим несколько вариантов:
- Открыв раздел «Местоположение», необходимо выбрать пункт «Дополнительно», затем «Определять местоположение», а после этого активировать опцию «Определять местоположение точнее».
- В настройках местоположения выбрать пункт «Геолокация Google», а затем «Определять местоположение точнее».
Отслеживание геолокации может происходить не только с помощью сигнала GPS, но и с помощью Wi-Fi и Bluetooth. Поэтому для повышения точности необходимо активировать для определения местоположения и то, и другое. Сделать это можно также в настройках:
- Открыть меню «Местоположение», выбрать пункт «Режим» и нажать на строку «По всем источникам».
- Если раздел «Режим» отсутствует, нужно открыть пункт «Поиск сетей Wi-Fi и устройств Bluetooth» в настройках местоположения. В нем нужно активировать два ползунка: «Поиск Wi-Fi» и «Поиск Bluetooth».
Сброс данные A-GPS
Увеличить точность можно путем сброса данных A-GPS с помощью специализированных приложений, например, GPS-Status Data. Его необходимо установить на телефон, открыть, а затем выбрать пункт «Reset GPS assistance data». Если и это не помогло, необходимо проверить работу GPS-приемника.
Проверка работы GPS в телефоне
Это действие поможет выявить неполадки в работе GPS-приемника. Однако пользователю понадобится скачать и установить специализированное приложение, например, Locus Map или inViu GPS-details. Они позволят определить, насколько хорошо GPS-приемник ловит сигналы спутников. Для проверки необходимо:
- Выбрать ясный день, выйти на улицу, где не будет заметных препятствий для прохождения сигнала (высотных зданий, высоких деревьев с широкими кронами и т.д.).
- Затем необходимо открыть одно из перечисленных выше приложений, запустить и подождать не менее 3 минут, пока телефон будет принимать сигналы спутников. При нормальной работе приемника число спутников, чей сигнал телефон принял, должно быть выше 4. Чем их больше, тем точнее будет сигнал.
- После этого нужно открыть любое приложение-навигатор и посмотреть, насколько велика погрешность определения местоположения.
После проверки пользователь сможет сделать определенные выводы:
- Неточность менее 10 метров говорит о нормальной работе GPS-приемника.
- Неточность более 10 метров свидетельствует о некачественном GPS-приемнике в телефоне.
Если телефон не увидел ни одного спутника, его стоит отнести в сервисный центр, так как этот факт говорит о неисправности GPS-приемника.
Источник
Простой способ добавить геолокацию в свой проект для Android
Долго я прочёсывал интернет в поисках простого решения, как мне в проект добавить 1 только класс и больше не беспокоиться о проблемах геолокации.
Критерии были такие:
1) решить всё в 1 классе, как можно меньше используя внешний код.
2) у пользователя должна быть всегда под рукой 1 static переменная в которой указанно его местоположение и больше ни о чём он знать не должен.
Большинство постов не отвечало на поставленный вопрос: конечно сначала нужно обратиться к сервису, потом нужно установить listner, потом вы можете посмотреть на трёхстраничный краткий пример как это делать.
В итоге я написал свой класс, с которым и хочу вас познакомить: он прост в использовании и с ним сможет справиться любой: просто добавьте его в проект и будет вам счастье.
Итак, что же здесь есть?
Класс разделен на 3 части:
1) imHere — переменная типа Location, в которой будет всегда доступна самая последняя информация о местоположении пользователя.
2) функция SetUpLocationListener — в любом случае нам нужна будет начальная установка для того, чтобы система начала сама без нашего участия выполнять обновление переменной imHere.
3) все остальные обязательные части LocationListener, которые можно переделать по собственному желанию.
Итак, как это работает?
1) создаем класс MyLocationListener
2) копируем в него код написанный выше
3) в основной функции (например MainActivity) ближе к началу запускаем:
или для любителей потоков
4) теперь у нас всегда и в любой части нашего проекта есть переменная MyLocationListener.imHere типа Location, в которой хранится самое последнее местоположение пользователя и множество дополнительной информации, как например скорость или точность определения местоположения.
И в заключение: это принципиальный код и тут есть что улучшать. Например нужно учитывать, что первое время локация может быть не определена и imHere будет null, но это всё не скоро: сейчас у нас есть класс, который позволяет нам без лишних усилий и с минимумом знаний добавить геолокацию в свой проект.
(!) Не забудьте: в зависимости от выбранного провайдера нужно добавить в манифест соответствующее разрешение. Например используемый выше GPS_PROVIDER требует добавления следующей строчки в манифест:
Источник
Глубокое погружение в определение местоположения
Этот пост является переводом топика из блога android-developers. Далее повествование ведется от Рето Майера, автора книги Professional Android 2 Application Development. Он пишет о том, как можно улучшить приложения, использующие местоположение, в смысле кэширования результатов, скорости работы и так далее.
Без разницы, ищете ли вы место, где бы поесть, или ближайшее место велосипедов Boris Bike, всегда есть задержка при получении данных местоположения от GPS и заполнении абстрактного списка результатов в вакууме. Когда вы находитесь в месте, где хотели бы получить контекстную информацию, то часто вы сталкиваетесь с отсутствием подключения к данным.
Вместо того, чтобы грозить кулаком в небо, я написал open-source приложение, которое включает в себя советы и рекомендации по сокращению времени между открытием приложения и просмотром актуальной информации о близлежащих местах, вкупе с разумным обеспечением offline режима работы. И всё это, сохраняя использование аккумулятора на возможном минимуме.
Покажи мне код!
Вы можете проверить мой проект Android Protips for Location. Не забудьте прочесть Readme.txt, чтобы успешно скомпилировать и запустить приложение.
Что оно делает на самом деле?
Оно использует Google Places API для реализации базовой функциональности приложений, которые которые используют местоположение для определения списка близлежащих достопримечательностей (точек на карте), позволяют просмотреть их детали, а также проверить или оценить.
Код реализует многие из лучших практик, о которых я подробно рассказал на своей сессии на Google I/O 2011, Android Protips: Advanced Topics for Expert Android Developers (видео). В том числе использование Intent’ов для получения обновлений о местоположении, используя Passive Location Provider, наблюдение за состоянием устройства для изменения частоты обновлений, переключение Receiver’ов во время исполнения приложения, и также используя Cursor Loader.
Приложение написано для Honeycomb, но также может работать и на версия 1.6 и выше.
Теперь у вас есть код, давайте подробнее рассмотрим его
Мой главный приоритет — свежесть: минимизация задержек между открытием приложения и возможностью проверить нужные места, и в то же время минимизировать использование аккумулятора.
Требования:
- Текущее местоположение должно находиться так быстро, как это возможно
- Список мест должен обновляться при изменение местоположения
- Список близлежащих мест должен быть доступен (в деталях) в автономном режиме
- Отметки также должны быть доступны в автономном режиме
- Данные о местоположении и другие данные пользователя должны быть правильно обработаны (см. более ранний пост с лучшими практиками )
Свежесть — значит никогда не ждать
Можно значительно сократить время ожидания получения первого приближения к местоположению, путём выбора последнего известного из Location Manager’a каждый раз, когда приложение переходит в активный режим.
В этом примере из GingerbreadLastLocationFinder, мы перебираем все провайдеры местоположения на устройстве, даже те, которые на данный момент недоступны, чтобы найти наиболее точное последнее местоположение.
Если есть координаты одного или более местоположений, то выбирается самое точное. Иначе, просто возвращается самый недавний результат.
Во втором случае (когда определено, что последнее обновление местоположения недостаточно недавнее), значение так или иначе возвращается, но мы запрашиваем одно обновление местоположения, используя самый быстрый провайдер.
К сожалению, мы не можем определить наибыстрейших провайдеров, но, на практике, понятно, что определение местоположения при помощи сети возвращает результаты быстрее.
Отметим также, что этот фрагмент кода показывает GingerbreadLastLocationFinder, который использует метод requestSingleUpdate для получения единоразового обновления местоположения. Эта функциональность не была доступна до Gingerbread — проверьте LegacyLastLocationFinder, посмотрите как я реализовал такую же функциональность для более ранних версий Android.
singleUpdateReceiver передает полученное обновление назад к вызывающему классу через слушателя Location Listener.
Используйте Intent’ы для получения обновлений местоположения
Получив наиболее точную/своевременную оценку текущей позиции, мы также хотим получать её обновления.
Класс PlacesConstants включает в себя набор значений, которые определяют частоту обновления местоположения. Настройте их, чтобы убедиться, что обновления приходят так часто, как это требуется.
Следующий шаг — запросить обновление местоположения от Location Manager. В следующем фрагменте кода, взятом из GingerbreadLocationUpdateRequester мы можем передать критерии, используемые для определения — какой Location Manager будет запрашивать обновления напрямую в вызове метода requestLocationUpdates.
Обратите внимание, что мы передаём Pending Intent, а не Location Listener.
Вообще, я предпочитаю использовать Location Listener’ов, потому что они предоставляют гибкость в регистрации приёмников в нескольких Activity или Сервисах, или напрямую в манифесте.
В этом приложении, новое местоположение означает обновленный список близлежащих мест. Это происходит через сервисы, которые отправляют запросы к серверу и обновляют Контент-провайдер, который заполняет список мест.
Так как изменение местоположения напрямую не обновляет UI, то имеет смысл создавать и регистрировать связанный LocationChangedReceiver в манифесте, а не в Activity.
LocationChangedReceiver извлекает местоположение из каждого обновления и запускает сервис PlaceUpdateService, чтобы обновить базу близлежащих мест.
Получение данных во время автономной работы
Чтобы добавить поддержку режима offline, мы начнём с кэширования результатов поиска по PlacesContentProvider и PlaceDetailsContentProvider.
Также, при определенный обстоятельствах нужно проводить выборку сведений о местоположении. Этот фрагмент кода из сервиса PlacesUpdateService демонстрирует, как предварительная выборка включается для ограниченного количества мест.
Обратите внимание на то, что предварительная выборка данных потенциально выключается при низком заряде аккумулятора.
Похожая техника используется для реализации offline отметок.
Оптимизация времени работы аккумулятора: умные сервисы и использование состояния устройства для переключения ресиверов
Нет смысла запускать сервис обновления, когда устройство находится в автономном режиме. Сервис PlaceUpdateService проверяет возможность соединения, прежде чем пытаться получить обновление.
Если соединения нет, то ActiveLocationChangedReceiver и PassiveLocationChangedReceiver выключаются, а ConnectivityChangedReceiver включается.
ConnectivityChangedReceiver прослушивает все изменения сетевого соединения. Когда производится новое подключение, то он просто выключает себя и включает слушателей местоположения.
Мониторинг состояния аккумулятора для уменьшения функциональности и экономии энергии
Когда телефон на последних 15%, то большинство приложений не работает, для того чтобы сохранить заряд. Мы можем зарегистрировать ресиверов в манифесте, чтобы выдавать предупреждение, когда устройство входит или выходит из состояния низкой батареи.
Этот фрагмент из PowerStateChangedReceiver выключает PassiveLocationChangedReceiver всякий раз, когда устройство переходит в состояние низкого аккумулятора и включает его, когда заряд в порядке.
Можно расширить эту логику, отключив все упреждающие выборки или уменьшив частоту обновления в условиях низкого заряда аккумулятора.
Источник