- How to get user current location with GPS or Network in Android?
- Android Location using GPS, Network Provider
- AppLocationService.java
- AndroidLocationActivity.java
- AndroidManifest.xml
- Android GPS Network Provider Output
- Download GPS Location Android Project
- Popular Articles
- Comments on «Android Location using GPS, Network Provider»
- Когда мне нужно android.hardware.location.gps и android.hardware.location.network?
- ACCESS_COARSE_LOCATION
- ACCESS_FINE_LOCATION
How to get user current location with GPS or Network in Android?
Thanks to smartphones, modern mobile applications can benefit from GPS installed to get user current location. This information adds a lot of value to an application. Web’s giants have understood this since long time.
So, in your next application, you could use GPS or Network to get user current location and add value to your application. For example, if you create a weather application it is essential to know user location to access local weather associated.
To achieve that, there are 2 solutions in Android :
- User SDK standard solution
- Use Location APIs from Google Play Services
In this tutorial, we’re going to learn how to get user location by using SDK standard solution. It can be a better solution because some smartphones haven’t Google Play Services installed. So, combine both solutions can also be a good approach for your application.
First, you need to update your Android Manifest and add ACCESS_FINE_LOCATION permission like this :
In Android standard SDK, you have several providers that can provider you user’s location. Best is obviously GPS but you can get location informations from Network. To be sure to get user’s location, we’re trying to get user location from these both providers. So, you need to add INTERNET permission to your Android Manifest :
Now, you can create location getter class. First, you need to get LocationManager service that is a system service. Instance of LocationManager lets you to check if a particular provider is enabled or no thanks to isProviderEnabled method with provider type in parameter.
If GPS and Network providers are disabled, we stop and return false to indicate to caller that there are no providers enabled on user’s device. Otherwise, we request location updates thanks to method requestLocationUpdates. This method takes a LocationListener instance that will be called when there is an event : location changed, provider disabled, provider enabled or status changed.
To limit user’s location search, we use a GetLastLocation task delayed in 20 seconds. In that task, we stop user’s location search and try to get last known location if there is no result before during request. If there are both results : one from GPS and one from Network, we take the last one.
To let user get user’s location when it’s available, we use a LocationResult abstract class with a gotLocation method that is called when location is found or search is ended.
Our LocationGetter class is like that :
Now, you must call your LocationGetter instance from an activity like that :
Источник
Android Location using GPS, Network Provider
GPS and network providers are two different ways to get Android device location (latitude and longitude). GPS and network location providers have got their own advantages and we may have to use both in sync. In in-door situations GPS may not provide the location quickly and network location provider is quick. Network location provider uses our mobile connectivity provider and will give the nearest tower location. GPS gives the exact location of where we are standing.
Having said all the above, I just noticed that I have written an Android GPS tutorial already. Though I feel like a buffoon, somehow I have to manage now. Its okay, it will do no harm if we have two different examples for the same purpose.
There is not much we need to do, Android API takes care of everything. We need to implement LocationListener and make it a service class by extending Android Service API. Then use the Android’s LocationManager API to get the latitude and longitude location. Nothing much to discuss, lets jump into the code.
AppLocationService.java
We can use the onLocationChanged() method to continuously monitor/get the device location.
AndroidLocationActivity.java
This is the main activity having two buttons, each for GPS and Network provider. Used a toast to show the message and if the GPS or Network or not enabled in the device then we show an alert with a shortcut to the settings.
AndroidManifest.xml
Android manifest file is important here. Just note the “uses-permission” tag below. We need to those tags for accessing GPS and network provider.
Android GPS Network Provider Output
If GPS or Network setting are not enabled:
Download GPS Location Android Project
Popular Articles
Comments on «Android Location using GPS, Network Provider»
sir,
can you explain how we can set on GPS by code instead of asking user to set on GPS
Источник
Когда мне нужно android.hardware.location.gps и android.hardware.location.network?
Google сообщает по электронной почте об изменениях в разрешениях на местоположение Android:
Мы вносим изменения 15 октября 2016 года, что повлияет на приложения, ориентированные на API версии 21 (Android 5.0, Lollipop) или выше, которые используют ACCESS_FINE_LOCATION, но явно не используют функцию «android.hardware.location.gps». В дальнейшем эти приложения будут доступны для установки на устройствах, которые не имеют оборудования GPS. В большинстве случаев это не будет проблемой, поскольку местоположение Wi-Fi и Cell-ID обеспечивает достаточно высокую точность для типичной работы этих приложений. Тем не менее, любые приложения, для которых требуется оборудование GPS, например GPS-навигаторы, должны явно добавить в свой манифест функцию использования android.hardware.location.gps.
Если вашему приложению требуется, чтобы GPS функционировала должным образом, и вы не включаете в декларацию манифеста, у ваших пользователей может быть плохое приложение.
Кроме того, если вы используете провайдера плавного местоположения и хотите получать наиболее точные образцы местоположения из GPS (т. Е. С PRIORITY_HIGH_ACCURACY), вы должны включить функцию «android.hardware.location.gps» в манифест вашего приложения, чтобы гарантировать, что Google Play только распространяет ваше приложение на устройства с датчиками GPS.
Подробнее об этом изменении можно узнать в Справочном центре разработчиков Android .
В Справочном центре разработчиков Android
Чтобы получать обновления местоположения от NETWORK_PROVIDER или GPS_PROVIDER, вы должны запросить разрешение пользователя, объявив соответственно разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION в файле манифеста Android. Без этих разрешений ваше приложение будет терпеть неудачу во время выполнения при запросе обновлений местоположения.
Если вы используете как NETWORK_PROVIDER, так и GPS_PROVIDER, вам нужно запросить только разрешение ACCESS_FINE_LOCATION, поскольку оно включает разрешение для обоих поставщиков. Разрешение для ACCESS_COARSE_LOCATION позволяет получить доступ только к NETWORK_PROVIDER.
Внимание! Если ваше приложение предназначено для Android 5.0 (API уровня 21) или выше, вы должны заявить, что ваше приложение использует аппаратную функцию android.hardware.location.network или android.hardware.location.gps в файле манифеста, в зависимости от того, Приложение получает обновления местоположения от NETWORK_PROVIDER или от GPS_PROVIDER. Если ваше приложение получает информацию о местоположении из любого из этих источников провайдера, вам необходимо объявить, что приложение использует эти аппаратные функции в вашем манифесте приложения. На устройствах, работающих с версиями до Android 5.0 (API 21), запрос разрешения ACCESS_FINE_LOCATION или ACCESS_COARSE_LOCATION включает подразумеваемый запрос на аппаратные функции местоположения. Однако, запрашивая эти разрешения, автоматически не запрашивает аппаратные функции местоположения на Android 5.0 (API уровня 21) и выше.
Я использую поставщика ACCESS_FINE_LOCATION , ориентированного на API 21, и используя ACCESS_FINE_LOCATION . Я не особо забочусь о том, доступен ли GPS, только сообщается о самом точном месте.
- Основываясь на первой цитате, я думаю, что мне не нужно вносить какие-либо изменения.
- Основываясь на второй цитате, я думаю, мне нужны и android.hardware.location.gps и android.hardware.location.network . Или это только для LocationManager а не для плавного расположения?
Нужен ли мне файл android.hardware.location.gps и android.hardware.location.network или нет?
Вторая цитата говорит вам, что вам нужно либо android.hardware.location.network либо android.hardware.location.gps , если вам определенно нужен тот или иной провайдер.
Если вы хотите получать обновления через GPS, вам потребуется android.hardware.location.gps . Если вы хотите получать обновления через Wi-Fi и сотовые сети, вам потребуется android.hardware.location.network .
Если вы хотите получать обновления из сети и GPS, вы должны включить оба элемента .
Если вы также не укажете, ваше устройство может быть установлено на устройствах без этого провайдера. Например, он может быть установлен на устройстве без GPS, сотовой сети или чипа Wi-Fi.
Другими словами, для получения местоположения требуется либо функция определения местоположения сети, либо функция GPS. Если вы не заявляете, что ваше приложение нуждается в том или ином, вы можете вообще не получать обновления местоположения.
API 21 против 20 и ниже
Обратите внимание, что вышеизложенное применимо только для API 21 и выше. До API 21 запрос разрешения ACCESS_COARSE_LOCATION подразумевал функцию location.network , если запрос ACCESS_FINE_LOCATION подразумевал функцию location.gps (см. ACCESS_FINE_LOCATION ).
Единственное изменение прямо сейчас в том, что для API 21+ любое приложение, запрашивающее ACCESS_FINE_LOCATION , скоро будет доступно для установки на устройства без GPS. Если ваше приложение ранее предполагало, что GPS был доступен (и нуждается в GPS), вам нужно убедиться, что у вас есть явный запрос для android.hardware.location.gps .
Google говорит, что провайдеры сетевых местоположений теперь достаточно хороши для прекрасного местоположения, таким образом, изменения.
TL; DR : Нет, вам не нужно добавлять uses-feature в ваш манифест, но в зависимости от этого вы можете.
Полный ответ :
uses-feature манифеста заключается только в том, что Google Play может отфильтровывать устройства, которые не содержат функции, необходимые для правильного выполнения приложения. (Примеры – GPS для поворотного навигационного приложения или камеры для приложения для камеры).
Внимательно прочитайте эту цитату:
Любые приложения, для которых требуется оборудование GPS, например GPS-навигаторы, должны явно добавить функцию android.hardware.location.gps в свой манифест
И хотите получить наиболее точные образцы местоположения из GPS
Как вы помните, вам все равно, что FusedLocationProvider дает вам лучшее место, доступное для устройства. Это означает, что, даже если вы запрашиваете PRIORITY_HIGH_ACCURACY , ваше приложение может быть установлено на устройствах, которые не содержат GPS, и никогда не получит точное местоположение, такое как GPS, или, может быть, даже (в очень редком нечетном случае), будет установлено на Устройство, которое не содержит провайдера местоположений.
редактировать:
Основываясь на второй цитате, я думаю, мне нужны и android.hardware.location.gps, и android.hardware.location.network. Или это только для LocationManager, а не для плавного расположения?
- android.hardware.location
- android.hardware.location.gps
- android.hardware.location.network
Поэтому на основе этого, если ваше приложение не может работать без какой-либо формы, вы должны использовать первый файл android.hardware.location , иначе, если ваше приложение использует местоположение, но это не существенно для его функциональности, вы можете свободно не включать ничего
Быстрое и простое решение:
Приложение должно обновляться через использование GPS android.hardware.location.gps. Если вы хотите получать обновления через Wi-Fi и сотовые сети, вам потребуется android.hardware.location.network.
Добавьте ниже строки в файл манифеста в соответствии с вашими данными о местоположении:
Надеюсь это поможет..
По вашим вопросам
Основываясь на первой цитате, я думаю, что мне не нужно вносить какие-либо изменения.
Вам не нужно вносить какие-либо изменения, так как вы используете FusedLocation которые автоматически обнаруживают GPS и NetworkProvider в соответствии с доступностью и дают вам наилучшее местоположение оценки ( вам нужно добавить ACCESS_FINE_LOCATION разрешение для получения высокой точности ). Так что даже если вы ACCESS_FINE_LOCATION таргетинг на версию API 21 вам не нужно ничего менять в своем приложении. FusedLocation будет работать по-прежнему.
И по второй котировке
Вам просто нужно игнорировать его, потому что вы используете FusedLocation API, и вы не используете API LocationManager который вы заменили FusedLocation Второе предложение предназначено только для приложений, которые используют LocationManagar .
NETWORK_PROVIDER и GPS_PROVIDER являются частью API LocationManager Not FusedLocation
По моему мнению, достаточно прочитать документацию для элемента uses-feature, чтобы понять, как приложения фильтруются в Google Play на основе неявных и явных записей использования:
Google Play фильтрует приложения, видимые для пользователей, чтобы пользователи могли видеть и загружать только те приложения, которые совместимы с их устройствами. Одним из способов фильтрации приложений является совместимость компонентов.
Чтобы определить совместимость функций приложения с данным устройством пользователя, Google Play сравнивает:
Функции, требуемые приложением – приложение объявляет функции в элементах своего манифеста с … Возможности, доступные на устройстве, в аппаратном или программном обеспечении – устройство сообщает о функциях, которые оно поддерживает, как свойства системы только для чтения.
Если функция явно объявлена необходимой, Google Play добавляет эту функцию в список необходимых функций для приложения. Затем он фильтрует приложение от пользователей на устройствах, которые не предоставляют эту функцию.
Если функция явно объявлена не требуемой, Google Play не добавляет эту функцию в список необходимых функций. По этой причине явно объявленная необязательная функция никогда не рассматривается при фильтрации приложения. Даже если устройство не предоставляет объявленную функцию, Google Play по-прежнему будет рассматривать приложение, совместимое с устройством, и покажет его пользователю, если не применяются другие правила фильтрации.
Неявные элементы uses-feature для разрешений местоположения:
ACCESS_COARSE_LOCATION
- android.hardware.location
- android.hardware.location.network (Только если уровень API-интерфейсов равен 20 или ниже).
ACCESS_FINE_LOCATION
- android.hardware.location
- android.hardware.location.gps (Только при уровне целевого API 20 или ниже).
Изменения, описанные в электронном сообщении Google, ACCESS_FINE_LOCATION том, что неявные элементы uses-feature для android.hardware.location.gps не будут присутствовать в API 21+ с ACCESS_FINE_LOCATION . Аналогичная ситуация справедлива для ACCESS_COARSE_LOCATION и android.hardware.location.network .
Google поощряет явное перечисление всех записей об uses-feature , но все же предоставляет неявные записи на основе разрешений. Из следующего отрывка документации, я думаю, нет никакой разницы между отсутствием функции uses-feature и объявлением, что это не требуется, если нет неявной записи uses-feature .
Если функция явно объявлена не требуемой, Google Play не добавляет эту функцию в список необходимых функций.
Вариант использования вашей заявки определяет, какие записи использования должны присутствовать. Вот несколько примеров использования, когда требуются все записи uses-feature , если не указано иное:
Приложение использует GPS явно из LocationManager или приложение требует высокой точности GPS. Это пример, приведенный в электронной почте Google.
- ACCESS_FINE_LOCATION
- android.hardware.location (неявный)
- android.hardware.location.gps (подразумевается до API 20)
Использует сетевое расположение явно
- ACCESS_COARSE_LOCATION
- android.hardware.location (неявный)
- android.hardware.location.network (подразумевается до API 20)
Использует GPS и сеть
- ACCESS_FINE_LOCATION
- android.hardware.location (неявный)
- android.hardware.location.gps (подразумевается до API 20)
- android.hardware.location.network
Использует по крайней мере один из GPS и сети. Это мой случай FusedLocationProviderApi в исходном вопросе.
- ACCESS_FINE_LOCATION / ACCESS_COARSE_LOCATION
- android.hardware.location (неявный)
Использование местоположения, если доступно, по-прежнему позволяет установку приложения, если он недоступен
- ACCESS_FINE_LOCATION
- android.hardware.location required = false (переопределить неявный)
- android.hardware.location.gps required = false (переопределить неявный до API 20)
Да, вам нужны оба разрешения, если вы используете плавный провайдер.
Источник