Я хочу создать приложение, которое будет ориентировано на получение текущего местоположения пользователя, а затем находить точки интереса (например, бары, рестораны и т. Д.), Которые находятся рядом с ним через API Google Адресов .
После поиска в Интернете места для начала я наткнулся на некоторые учебные пособия, в которых используется этот LocationManager
класс, и некоторые другие, в которых используются службы Google Play , чтобы найти местоположение пользователей.
На первый взгляд они оба делают одно и то же, но, поскольку я новичок в этом, я немного запутался, и я не знаю, какой метод лучше всего соответствует моим потребностям. Итак, я хочу спросить вас:
Каковы различия между этими двумя методами поиска местоположений (если они есть)?
android
gps
geolocation
SoCo
источник
источник
Ответы:
Расположение пользователя на Android
Получить местоположение пользователя на Android немного проще, чем на iOS. Чтобы начать путаницу, есть два совершенно разных способа сделать это. Первый использует API-интерфейсы Android от
android.location.LocationListener
, а второй использует API-интерфейсы Google Play Servicescom.google.android.gms.location.LocationListener
. Давайте пройдем через них обоих.Android Location API
API определения местоположения Android используют три разных провайдера для определения местоположения -
LocationManager.GPS_PROVIDER
- Этот провайдер определяет местоположение с помощью спутников. В зависимости от условий этому провайдеру может потребоваться некоторое время для возврата местоположения.LocationManager.NETWORK_PROVIDER
- Этот провайдер определяет местоположение в зависимости от наличия сотовой вышки и точек доступа WiFi. Результаты извлекаются с помощью поиска в сети.LocationManager.PASSIVE_PROVIDER
- Этот провайдер возвращает местоположения, созданные другими провайдерами. Вы пассивно получаете обновления местоположения, когда другие приложения или службы запрашивают их, фактически не запрашивая местоположения самостоятельно.Суть в том, что вы получаете объект
LocationManager
из системы, реализуетеLocationListener
и вызываетеrequestLocationUpdates
егоLocationManager
.Вот фрагмент кода:
Руководство Google API по стратегиям размещенияобъясняет код довольно красиво. Но они также отмечают, что в большинстве случаев вы получите лучшую производительность батареи, а также более подходящую точность, используя API Google Location Services вместо этого . Теперь путаница начинается!Google Location Services API является частью Google Play Services APK ( вот как его настроить ). Они построены на основе Android API. Эти API предоставляют «провайдера объединенного местоположения» вместо провайдеров, упомянутых выше. Этот провайдер автоматически выбирает, какого основного провайдера использовать, основываясь на точности, использовании батареи и т. Д. Это происходит быстро, потому что вы получаете местоположение из общесистемной службы, которая постоянно обновляет ее. И вы можете использовать более продвинутые функции, такие как геозоны.
Чтобы использовать Google Location Services, ваше приложение должно подключиться к
GooglePlayServicesClient
. Чтобы подключиться к клиенту, ваша деятельность (или фрагмент, или около того) должны быть реализованыGooglePlayServicesClient.ConnectionCallbacks
иGooglePlayServicesClient.OnConnectionFailedListener
интерфейсы. Вот пример кода:locationClient.getLastLocation()
ноль?locationClient.getLastLocation()
Получает последнее известное местоположение от клиента. Однако провайдер локализованного местоположения будет поддерживать фоновое местоположение, только если к нему подключен хотя бы один клиент. Как только первый клиент подключится, он сразу попытается найти местоположение. Если ваша деятельность является первым клиентом для подключения и вы звонитеgetLastLocation()
сразу вonConnected()
, что не может быть достаточно времени для первого места , чтобы войти. Это приведет кlocation
бытьnull
.Чтобы решить эту проблему, вы должны ждать (неопределенно), пока провайдер не определит местоположение, а затем позвонить
getLastLocation()
, что невозможно узнать. Другой (лучший) вариант - реализоватьcom.google.android.gms.location.LocationListener
интерфейс для получения периодических обновлений местоположения (и отключить его, как только вы получите первое обновление).В этом коде вы проверяете, есть ли у клиента последнее местоположение (in
onConnected
). Если нет, вы запрашиваете обновления местоположения и отключаете запросы (в режимеonLocationChanged()
обратного вызова), как только вы получаете обновление.Обратите внимание, что
locationClient.requestLocationUpdates(locationRequest, this);
он должен быть внутриonConnected
обратного вызова, иначе вы получите запрос,IllegalStateException
потому что вы будете пытаться запрашивать местоположения, не подключенные к клиенту Google Play Services.Во многих случаях у пользователя могут быть отключены службы определения местоположения (для экономии заряда аккумулятора или в целях конфиденциальности). В таком случае приведенный выше код все равно будет запрашивать обновления местоположения, но
onLocationChanged
никогда не будет вызван. Вы можете остановить запросы, проверив, отключил ли пользователь службы определения местоположения.Если ваше приложение требует, чтобы они включили службы определения местоположения, вы хотели бы показать сообщение или тост. К сожалению, нет способа проверить, отключил ли пользователь службы определения местоположения в API служб определения местоположения Google. Для этого вам придется прибегнуть к API Android.
В вашем
onCreate
методе:И используйте
locationEnabled
флаг в вашемonConnected
методе так:ОБНОВИТЬ
Документ обновлен, LocationClient удален, и API поддерживает включение GPS одним щелчком мыши из диалогового окна:
Ссылка на сайт https://developer.android.com/training/location/change-location-settings#prompt
Новый клиент местоположения: FusedLocationProviderClient
Рекомендуется пройти через https://developer.android.com/training/location перед выполнением каких-либо задач определения местоположения.
источник
SettingsApi.checkLocationSettings()
чтобы проверить, активировал ли пользователь Службы определения местоположения (см. Здесь: developers.google.com/android/reference/com/google/android/gms/… ).LocationManager
! Работает ли API-интерфейс fused location на устройствах без сервисов Google Play?fun isLocationEnabled(context: Context): Boolean { val locationMode: Int try { locationMode = Settings.Secure.getInt( context.contentResolver, Settings.Secure.LOCATION_MODE ) } catch (e: SettingNotFoundException) { e.printStackTrace() return false } return locationMode != Settings.Secure.LOCATION_MODE_OFF }
По моему опыту, «более подходящая точность» никоим образом не значит лучше. Если вы не пропустили что-то, если вы хотите убедиться, что GPS используется, LocationManager - единственный путь. Мы отслеживаем транспортные средства с помощью нашего приложения, и, опять же, если я что-то упускаю, Сервисы Google Play довольно часто предоставляют некоторые неточные местоположения.
источник
Вы должны использовать API местоположения Google Play Services вместо LocationManager. Согласно документам:
Что касается того, почему переключаться, Google говорит это:
источник
Я уже давно пользуюсь API Google Location Services. У него есть преимущества, поскольку он заключает в себе сложность наличия нескольких источников для определения позиций. Однако он слишком сильно инкапсулируется , поэтому, когда вы получаете странную позицию, у вас нет возможности определить, откуда эта странная позиция появилась.
В реальной жизни у меня появилось несколько странных ценностей, находящихся в 10-х километрах от фактического положения. Единственное объяснение состоит в том, что эти сумасшедшие местоположения происходят из-за ошибок в базах данных Googles Wi-Fi или NWK - ошибок, которые будут всегда, поскольку топологии Wi-Fi и сети меняются каждый день. Но, к сожалению (и удивительно), API не дает вам никакой информации о том, как была получена отдельная позиция.
Это оставляет вам проблемы с необходимостью отфильтровывать странные значения на основе проверки достоверности скорости, ускорения, подшипника и т. Д.
... или вернитесь к старому доброму API фреймворка и используйте только GPS, что я и решил делать, пока Google не улучшит объединенный API.
источник
API Google Location Services , входящий в состав Google Play Services, предоставляет более мощную высокоуровневую инфраструктуру, которая автоматически обрабатывает информацию о поставщиках местоположения , перемещении пользователей и точности определения местоположения . Он также обрабатывает планирование обновления местоположения на основе предоставленных вами параметров энергопотребления. В большинстве случаев вы получите лучшую производительность батареи , а также более точность, используя API сервисов определения местоположения.
Более подробно diffferences между двумя APIs Google Play Service Location API и Android Framework Расположение API можно найти здесь
источник
Да, API сервисов определения местоположения в Google Play может вводить в заблуждение информацию о местоположении. Модемы WiFi перемещаются, модемы WiFi обновляются с неверной информацией о местоположении (то есть, если местоположение подделывается устройством Android, которое обновляет местоположение модема WiFi), и существует множество других обстоятельств, которые могут привести к неправильным данным местоположения из триангуляции модема WiFi. Во всех наших приложениях, где точное местоположение является обязательным, мы используем только GPS.
источник
Различия между двумя API API определения местоположения службы Google Play и API определения местоположения Android Framework на основе службы GPS
FusedLocationProviderClient
requestLocationUpdates()
выборки он использует метод для извлечения местоположения.locationRequest.setInterval(milliseconds)
аsetFastestInterval(milliseconds)
не на изменении местоположения пользователяLocationManager Api
Выбор местоположения на основе изменения местоположения пользователя и временных интервалов
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, milliseconds, mindistance, Mylocationlistener)
Возвращенное значение LatLng содержит 14 десятичных значений (например: 11.94574594963342 79.81166719458997) точных значений местоположения
источник