LocationManager
API на Android кажется, это немного боли использовать для приложения , которое необходимо только изредка и грубое приближение местоположения пользователя.
Приложение, над которым я работаю, на самом деле не является приложением определения местоположения, но оно должно получить местоположение пользователя, чтобы отобразить список близлежащих предприятий. Не нужно беспокоиться о том, перемещается ли пользователь или что-то в этом роде.
Вот что я хотел бы сделать:
- Показать пользователю список близлежащих мест.
- Предварительно загрузите местоположение пользователя, чтобы к тому моменту, когда оно понадобится в
Activity
X, оно будет доступно. - Меня не особо заботит точность или частота обновления. Достаточно просто захватить одно место, пока оно не далеко. Возможно, если я захочу проявить фантазию, я буду обновлять местоположение раз в несколько минут или около того, но это не является огромным приоритетом.
- Работайте на любом устройстве, если оно имеет либо поставщика GPS, либо поставщика сетевого расположения.
Кажется, что это не должно быть так сложно, но мне кажется, что мне нужно раскрутить двух разных провайдеров местоположения (GPS и NETWORK) и управлять жизненным циклом каждого из них. Не только это, но я должен дублировать один и тот же код в нескольких действиях, чтобы удовлетворить # 2. В getBestProvider()
прошлом я пытался использовать это решение, чтобы сократить использование только одного провайдера местоположения, но, похоже, это даст вам только лучшего «теоретического» провайдера, а не провайдера, который фактически даст вам наилучшие результаты.
Есть ли более простой способ сделать это?
Ответы:
Вот что я делаю:
Вот как я использую свой класс:
А вот класс MyLocation:
Кто-то может также захотеть изменить мою логику. Например, если вы получаете обновление от сетевого провайдера, не останавливайте слушателей, а продолжайте ждать. GPS дает более точные данные, поэтому стоит подождать. Если время истекло, и вы получили обновление от сети, но не от GPS, вы можете использовать значение, предоставленное из сети.
Еще один подход заключается в использовании LocationClient http://developer.android.com/training/location/retrieve-current.html . Но это требует, чтобы Google Play Services apk был установлен на пользовательское устройство.
источник
После поиска лучшей реализации, как получить точное точное местоположение пользователя, мне удалось объединить все лучшие методы и придумать следующий класс:
Этот класс пытается подключиться к
min_gps_sat_count
спутникам, если GPS включен. Остальное возвращаетLocationManager.getBestProvider()
местоположение. Проверьте код!источник
import java.util.Iterator; import android.content.Context; import android.location.Criteria; import android.location.GpsSatellite; import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler;
С решением Федора я испытал многократное выполнение обратного вызова
gotLocation
. Кажется, это происходит из-за состояния гонки в переопределенномLocationListener.onLocationChanged
методе, когда метод gotLocation является «достаточно длинным» . Я не уверен, но я думаю,removeUpdates
предотвращает постановку в очередь новых сообщений в очереди Looper, но он не удаляет те, которые уже помещены в очередь, но еще не использованы. Отсюда и состояние гонки.Чтобы уменьшить вероятность этого неправильного поведения, можно вызвать removeUpdates до запуска события onLocationChanged, но все же мы имеем условие гонки.
Лучшее решение, которое я нашел, это заменить
requestLocationUpdates
наrequestSingleUpdate
.Это моя версия, основанная на решении Федора, использующая обработчик для отправки сообщения в поток сообщений:
Я использую этот класс из настраиваемого лупер-потока, как показано ниже:
где Coordinates - это простой класс с двумя свойствами: широта и долгота.
источник
Я создал небольшое приложение с пошаговым описанием, чтобы получить координаты GPS текущего местоположения.
Полный пример исходного кода в URL ниже:
Посмотри, как это работает :
Все, что нам нужно сделать, это добавить это разрешение в файл манифеста
и создать экземпляр LocationManager, как это
Проверьте GPS включен или нет
затем реализовать LocationListener и получить координаты
вот пример кода, чтобы сделать
источник
Вы всегда можете просто использовать LocationManager.getLastKnownLocation (), но, как говорится, он может быть устаревшим.
И простым способом получить общее местоположение может быть регистрация в сети (обычно довольно быстрая).
а затем делать
в
onLocationChanged()
методе слушателя.источник
Я написал подробное руководство по текущему местоположению здесь на demonuts.com Вы можете найти больше описания здесь, а также вы можете скачать весь исходный код демо для лучшего понимания.
Там уже есть много ответов, но я хочу показать последний способ определения местоположения с помощью Google API, чтобы новые программисты могли использовать новый метод:
Прежде всего, поместите это в файл Gradle
затем реализовать необходимые интерфейсы
объявлять случаи
положить это в
onCreate()
Наконец, переопределите необходимые методы
Не забудьте запустить GPS на вашем устройстве перед запуском приложения.
источник
На самом деле мы можем использовать двух провайдеров (GPS и сети). И они просто разделяют публичного слушателя:
Это необходимо, потому что
OnLocationChanged()
метод всегда должен быть вызван вовремя.источник
Я не уверен, что Службы определения местоположения могут получить местоположение из других инфраструктур, кроме GPS, но согласно этой статье это представляется возможным:
источник
Используйте приведенный ниже код, он предоставит вам лучшего поставщика:
источник
Рекомендуемый способ сделать это - использовать
LocationClient
:Сначала определите значения интервала обновления местоположения. Отрегулируйте это в соответствии с вашими потребностями.
У вашей
Activity
реализацииGooglePlayServicesClient.ConnectionCallbacks
,GooglePlayServicesClient.OnConnectionFailedListener
иLocationListener
.Затем установите
LocationClient
вonCreate()
методе вашегоActivity
:Добавьте необходимые методы к вашему
Activity
;onConnected()
это метод, который вызывается приLocationClient
подключении.onLocationChanged()
Здесь вы найдете самое актуальное местоположение.Обязательно подключайте / отключайте,
LocationClient
чтобы он использовал только дополнительную батарею, когда это абсолютно необходимо, и чтобы GPS не работал бесконечно.LocationClient
Должен быть подключен, чтобы получить из него данные.Получить местоположение пользователя. Сначала попробуйте использовать
LocationClient
; если это не поможет, вернитесь кLocationManager
.источник
Хотя ответ уже дан здесь. Я просто хотел поделиться этим с миром, если сталкиваюсь с таким сценарием.
Мое требование состояло в том, что мне нужно было получить текущее местоположение пользователя в течение максимум 30-35 секунд, поэтому вот решение, которое я принял после ответа Нирава Ранпара .
1. Я создал класс MyLocationManager.java, который обрабатывает все элементы GPS и сети
2. Я сделал интерфейс (обратный вызов) OnLocationDetectectionListener.java , чтобы сообщить результаты обратно вызывающему фрагменту или действию
3. Затем я выполнил действие MainAppActivty.java, которое реализует
OnLocationDetectectionListener
интерфейс, и вот как я получаю в нем свое местоположение4. Добавьте следующие разрешения в ваш файл манифеста
Надеюсь, что это полезно для других :)
источник
В течение более чем одного года я использовал комбинацию GPS_PROVIDER и NETWORK_PROVIDER, чтобы получить текущее местоположение, и оно работало хорошо, но в последние несколько месяцев я получаю местоположение после большой задержки, поэтому я переключился на последний API FusedLocationProviderClient и это работает довольно хорошо.
Вот класс, который я написал, чтобы получить текущее местоположение с помощью FusedLocationProviderClient. В приведенном ниже коде я использовал таймер, чтобы подождать некоторое время, чтобы получить текущее местоположение, я запланировал таймер на 15 секунд, вы можете изменить его в соответствии с вашими предпочтениями.
И назвал это от деятельности, вот код
Добавьте следующие записи в AndroidManifest.xml
источник
источник
Это код, который обеспечивает текущее местоположение пользователя
создать Карты Activty:
main.xml:
и определите следующее разрешение в манифесте:
источник
Это способ, которым я запрашиваю разрешения пользователя.
Вне вашего тега приложения в AndroidManifest.xml добавьте эти запросы на разрешение.
Затем добавьте зависимости Google Location в файл App Gradle.
Теперь объявите некоторые глобальные переменные.
В методе OnCreate вашей активности (я не смог правильно отформатировать код, извиняюсь за это)
Теперь создайте обе функции.
Второй метод
Для Constant.kt
источник
Улучшения в решении @ Fedor. Вместо того, чтобы запрашивать местоположение с интервалом времени «0» и расстоянием «0», мы можем использовать метод requestSingleUpdate менеджера местоположения . Обновленный код (версия kotlin)
Чтобы получить местоположение, нужно просто вызвать метод getLocation как -
Примечание. Перед вызовом метода getLocation должно быть предоставлено необходимое разрешение.
источник
Чтобы получить и показать текущее местоположение пользователя, вы также можете использовать
MyLocationOverlay
. Предположим, у вас естьmapView
поле в вашей деятельности. Все, что вам нужно сделать, чтобы показать местоположение пользователя, это:Это получает текущее местоположение от GPS или сети. Если оба не удастся,
enableMyLocation()
вернетсяfalse
.Что касается местоположения вещей вокруг области, то
ItemizedOverlay
надо делать свое дело.Надеюсь, я не понял ваш вопрос. Удачи.
источник
РЕДАКТИРОВАТЬ: обновлен до последней версии API сервиса определения местоположения из библиотеки Google Play Services (июль 2014 года)
Я бы порекомендовал вам использовать новый API службы определения местоположения , доступный в библиотеке служб Google Play, который предоставляет более мощную высокоуровневую среду, которая автоматизирует такие задачи, как выбор поставщика местоположения и управление питанием. Согласно официальной документации: «... Location API облегчает создание приложений, учитывающих местоположение, без необходимости сосредотачиваться на деталях базовой технологии определения местоположения. Они также позволяют минимизировать энергопотребление за счет использования всех возможностей. аппаратного обеспечения устройства. "
Для получения дополнительной информации посетите: Создание вашего приложения с учетом местонахождения
Чтобы увидеть полный пример с использованием последней версии API Службы определения местоположения: класс Android LocationClient устарел, но используется в документации
источник
Простой и лучший способ для GeoLocation.
источник
Немного поздно здесь, но я бы хотел в такой ситуации использовать API Карт Google и отмечать близлежащие местоположения, используя лат и длинный API карт Google. Плюс пользовательский опыт лучше, если вы можете показать его / ее местоположение на карте. Не нужно беспокоиться об обновлении местоположения пользователя или обмана с Android API. Позвольте Google Maps обрабатывать внутренности для вас.
@emmby, возможно, разрешил это в своем приложении, но для дальнейшего использования я рекомендую коллегам-разработчикам взглянуть на API карт Google для определения местоположения.
Изменить: Ссылка для отображения местоположения пользователя на картах Google
источник
Для получения обновлений местоположения в Android требуется много вещей, требуется много кода с болельерами.
Вы должны заботиться о
Я создал Android-EasyLocation (небольшая библиотека Android) которая позаботится обо всем этом, и вы сможете сосредоточиться на бизнес-логике.
Все, что вам нужно, это расширить EasyLocationActivity и это
или
Пример приложения для заказа и необходимые шаги здесь по адресу https://github.com/akhgupta/Android-EasyLocation
источник
Вот что я делаю:
mFinalLocation
).onDestroy()
методе обслуживания прекращает прослушивание обновлений местоположения для каждого поставщика.Ниже приведен код сервиса. Вы можете запустить его в зависимости от частоты обновления местоположения вам нужно.
источник
Котлин версия @Fedor Greate :
использование класса:
MyLocation
Учебный класс :источник
В классе деятельности делает настраиваемый метод:
Создайте пользовательское имя класса LocationGetter: -
источник
Используя FusedLocationProviderApi, который является новейшим API и лучшим из доступных возможностей для определения местоположения в Android. добавьте это в файл build.gradle
Вы можете получить полный исходный код по этому адресу http://javapapers.com/android/android-location-fused-provider/
источник
Недавно проведен рефакторинг для получения местоположения кода, изучения некоторых хороших идей и, наконец, достижения относительно совершенной библиотеки и демоверсии.
Полный код: https://github.com/bingerz/FastLocation/blob/master/fastlocationlib/src/main/java/cn/bingerz/fastlocation/FastLocation.java
* При каждом запросе на заполнение местоположения лучше всего удалять обновления, в противном случае в строке состояния телефона всегда будет отображаться значок позиционирования.
источник
Увидев все ответы и вопрос ( Самый простой и Надежный ). Я нажал только о библиотеке Android-ReactiveLocation .
Когда я сделал приложение отслеживания местоположения. Тогда я понял, что это очень типично для отслеживания местоположения с оптимизированной батареей.
Так что я хочу сказать свежим, а также разработчикам, которые не хотят поддерживать свой код местоположения с будущими оптимизациями. Используйте эту библиотеку.
Зависимости в уровне приложения build.gradle
Плюсы использования этой библиотеки:
источник