Je souhaite créer une application centrée sur l'obtention de l'emplacement actuel de l'utilisateur, puis trouver des points d'intérêt (tels que des bars, des restaurants, etc.) qui sont proches de lui via l' API Google Places .
En cherchant sur le Web un endroit où commencer, je suis tombé sur des didacticiels qui utilisent la LocationManager
classe et d'autres qui utilisent les services Google Play afin de trouver l'emplacement des utilisateurs.
À première vue, les deux font la même chose, mais comme je suis nouveau dans ce domaine, je suis un peu confus et je ne sais pas quelle méthode convient le mieux à mes besoins. Alors, je veux vous demander:
Quelles sont les différences entre ces deux méthodes de recherche d'emplacements (s'il y en a)?
android
gps
geolocation
SoCo
la source
la source
Réponses:
Localisation de l'utilisateur sur Android
Obtenir la position de l'utilisateur sur Android est un peu moins simple que sur iOS. Pour commencer la confusion, il existe deux façons totalement différentes de le faire. Le premier utilise les API Android de
android.location.LocationListener
, et le second utilise les API des services Google Playcom.google.android.gms.location.LocationListener
. Passons en revue les deux.API de localisation d'Android
Les API de localisation d'Android utilisent trois fournisseurs différents pour obtenir la localisation -
LocationManager.GPS_PROVIDER
- Ce fournisseur détermine l'emplacement à l'aide de satellites. Selon les conditions, ce fournisseur peut prendre un certain temps pour renvoyer un correctif d'emplacement.LocationManager.NETWORK_PROVIDER
- Ce fournisseur détermine l'emplacement en fonction de la disponibilité de la tour cellulaire et des points d'accès WiFi. Les résultats sont récupérés au moyen d'une recherche réseau.LocationManager.PASSIVE_PROVIDER
- Ce fournisseur renverra les emplacements générés par d'autres fournisseurs. Vous recevez passivement des mises à jour de localisation lorsque d'autres applications ou services en font la demande sans en faire la demande.L'essentiel est que vous obtenez un objet du
LocationManager
système, implémentez leLocationListener
et appelez lerequestLocationUpdates
sur leLocationManager
.Voici un extrait de code:
Guide API de Google sur les stratégies de localisationexplique assez bien le code. Mais ils mentionnent également que dans la plupart des cas, vous obtiendrez de meilleures performances de la batterie, ainsi qu'une précision plus appropriée, en utilisant plutôt l' API Google Location Services . Maintenant, la confusion commence!L'API des services de localisation de Google fait partie de l'APK des services Google Play ( voici comment la configurer ). Ils sont construits sur l'API d'Android. Ces API fournissent un «fournisseur d'emplacement fusionné» au lieu des fournisseurs mentionnés ci-dessus. Ce fournisseur choisit automatiquement le fournisseur sous-jacent à utiliser, en fonction de la précision, de l'utilisation de la batterie, etc. Il est rapide car vous obtenez l'emplacement d'un service à l'échelle du système qui continue de le mettre à jour. Et vous pouvez utiliser des fonctionnalités plus avancées telles que le géorepérage.
Pour utiliser les services de localisation de Google, votre application doit se connecter au
GooglePlayServicesClient
. Pour vous connecter au client, votre activité (ou fragment, ou presque) doit être implémentéeGooglePlayServicesClient.ConnectionCallbacks
etGooglePlayServicesClient.OnConnectionFailedListener
s'interfacer. Voici un exemple de code:locationClient.getLastLocation()
nul?Le
locationClient.getLastLocation()
obtient le dernier emplacement connu du client. Cependant, le fournisseur d'emplacement fusionné ne conservera l'emplacement en arrière-plan que si au moins un client y est connecté. Une fois le premier client connecté, il essaiera immédiatement d'obtenir un emplacement. Si votre activité est le premier client de se connecter et que vous appelezgetLastLocation()
tout de suite dansonConnected()
, qui pourrait ne pas être assez de temps pour le premier emplacement à venir. Cela se traduira parlocation
êtrenull
.Pour résoudre ce problème, vous devez attendre (indéterminé) jusqu'à ce que le fournisseur obtienne l'emplacement, puis appeler
getLastLocation()
, ce qui est impossible à savoir. Une autre (meilleure) option consiste à implémenter l'com.google.android.gms.location.LocationListener
interface pour recevoir des mises à jour de localisation périodiques (et à la désactiver une fois que vous avez obtenu la première mise à jour).Dans ce code, vous vérifiez si le client possède déjà le dernier emplacement (in
onConnected
). Sinon, vous demandez des mises à jour de localisation et désactivez les demandes (enonLocationChanged()
rappel) dès que vous recevez une mise à jour.Notez que le
locationClient.requestLocationUpdates(locationRequest, this);
doit être dans leonConnected
rappel, sinon vous obtiendrez unIllegalStateException
car vous tenterez de demander des emplacements sans être connecté au client des services Google Play.Plusieurs fois, l'utilisateur aurait désactivé les services de localisation (pour économiser la batterie ou pour des raisons de confidentialité). Dans un tel cas, le code ci-dessus demandera toujours des mises à jour de localisation, mais
onLocationChanged
ne sera jamais appelé. Vous pouvez arrêter les demandes en vérifiant si l'utilisateur a désactivé les services de localisation.Si votre application les oblige à activer les services de localisation, vous souhaiterez afficher un message ou un toast. Malheureusement, il n'existe aucun moyen de vérifier si l'utilisateur a désactivé les services de localisation dans l'API des services de localisation de Google. Pour cela, vous devrez recourir à l'API d'Android.
Dans votre
onCreate
méthode:Et utilisez le
locationEnabled
drapeau dans votreonConnected
méthode comme ceci:METTRE À JOUR
Le document est mis à jour, LocationClient est supprimé et l'API prend en charge l'activation du GPS en un seul clic dans la boîte de dialogue:
Lien https://developer.android.com/training/location/change-location-settings#prompt
Nouveau client d'emplacement: FusedLocationProviderClient
Il est recommandé de passer par https://developer.android.com/training/location avant d'effectuer des tâches de localisation.
la source
SettingsApi.checkLocationSettings()
pour vérifier si l'utilisateur a activé les services de localisation (voir ici: developer.google.com/android/reference/com/google/android/gms/… ).LocationManager
! L'API de localisation fusionnée fonctionne-t-elle sur les appareils qui ne disposent pas de services 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 }
D'après mon expérience, «une précision plus appropriée» ne signifie en aucun cas meilleure. À moins que je ne manque quelque chose, si vous voulez vous assurer que le GPS est utilisé, LocationManager est la seule solution. Nous suivons les véhicules avec notre application et, encore une fois, à moins que je ne manque quelque chose, les services Google Play fournissent assez souvent des emplacements très inexacts.
la source
Vous devez utiliser l'API de localisation des services Google Play au lieu de LocationManager. Selon la documentation:
Quant à savoir pourquoi changer, Google dit ceci:
la source
J'utilise l'API des services de localisation Google depuis un certain temps. Il présente des avantages, car il résume la complexité d'avoir plusieurs sources pour déterminer les positions. Cependant, il encapsule trop lourdement , de sorte que lorsque vous obtenez une position étrange, vous n'avez aucun moyen de déterminer d'où vient cette position étrange.
Dans la vraie vie, j'ai fait apparaître plusieurs valeurs bizarres, étant à 10 kilomètres de la position réelle. La seule explication est que ces emplacements fous proviennent d'erreurs dans les bases de données Googles Wi-Fi ou NWK - des erreurs qui seront toujours présentes, car les topologies Wi-Fi et réseau changent chaque jour. Mais malheureusement (et étonnamment) l'API ne vous donne aucune information sur la façon dont une position individuelle a été dérivée.
Cela vous laisse avec les problèmes de devoir filtrer les valeurs anormales en fonction de la vérification de la plausibilité de la vitesse, de l'accélération, du roulement, etc.
... ou revenez à la bonne vieille API du framework et n'utilisez que le GPS, ce que j'ai décidé de faire jusqu'à ce que Google améliore l'API fusionnée.
la source
L'API des services de localisation Google , qui fait partie des services Google Play, fournit un cadre plus puissant et de haut niveau qui gère automatiquement les fournisseurs de localisation , les déplacements des utilisateurs et la précision de la localisation . Il gère également la planification de la mise à jour de l'emplacement en fonction des paramètres de consommation d'énergie que vous fournissez. Dans la plupart des cas, vous obtiendrez de meilleures performances de la batterie , ainsi qu'une précision plus appropriée, en utilisant l'API des services de localisation.
Des différences plus détaillées entre les deux API Google Play Service Location API et Android Framework Location API peuvent être trouvées ici
la source
Oui, l'API des services de localisation des services Google Play peut fournir des informations de localisation très trompeuses. Les modems WiFi sont déplacés, les modems WiFi sont mis à jour avec des informations de localisation incorrectes (c'est-à-dire si l'emplacement est usurpé par un appareil Android qui met à jour l'emplacement du modem WiFi) et il existe une foule d'autres circonstances qui peuvent entraîner des données de localisation incorrectes à partir de la triangulation du modem WiFi. Dans toutes nos applications où la localisation précise est obligatoire, nous utilisons uniquement le GPS.
la source
Différences entre les deux API Google Play Service Location API et Android Framework Location API basée sur le service GPS
FusedLocationProviderClient
requestLocationUpdates()
méthode pour récupérer l'emplacement.locationRequest.setInterval(milliseconds)
etsetFastestInterval(milliseconds)
non sur le changement d'emplacement de l'utilisateurLocationManager Api
La recherche d'emplacement en fonction du changement d'emplacement de l' utilisateur et des intervalles de temps
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, milliseconds, mindistance, Mylocationlistener)
La valeur LatLng renvoyée contient 14 valeurs décimales (par exemple: 11,94574594963342 79,81166719458997) des valeurs de localisation précises
la source