Ich möchte eine App erstellen, die sich darauf konzentriert, den aktuellen Standort des Benutzers abzurufen und dann über die Google Places-API Sonderziele (wie Bars, Restaurants usw.) zu finden, die ihm nahe stehen .
Beim Durchsuchen des Webs nach einem Startpunkt stieß ich auf einige Tutorials, die die LocationManager
Klasse verwenden, und auf andere, die Google Play Services verwenden, um den Standort des Benutzers zu finden.
Auf den ersten Blick machen beide dasselbe, aber da ich neu in diesem Bereich bin, war ich etwas verwirrt und weiß nicht, welche Methode am besten zu meinen Bedürfnissen passt. Also möchte ich dich fragen:
Was sind die Unterschiede zwischen diesen beiden Methoden zum Auffinden von Orten (falls vorhanden)?
android
gps
geolocation
SoCo
quelle
quelle
Antworten:
Benutzerstandort auf Android
Das Abrufen des Standorts des Benutzers unter Android ist etwas unkomplizierter als unter iOS. Um die Verwirrung zu beginnen, gibt es zwei völlig verschiedene Möglichkeiten, wie Sie dies tun können. Die erste verwendet Android-APIs von
android.location.LocationListener
und die zweite verwendet Google Play Services-APIscom.google.android.gms.location.LocationListener
. Lassen Sie uns beide durchgehen.Die Standort-API von Android
Die Standort-APIs von Android verwenden drei verschiedene Anbieter, um den Standort abzurufen.
LocationManager.GPS_PROVIDER
- Dieser Anbieter ermittelt den Standort mithilfe von Satelliten. Abhängig von den Bedingungen kann es eine Weile dauern, bis dieser Anbieter einen Standortfix zurückgibt.LocationManager.NETWORK_PROVIDER
- Dieser Anbieter bestimmt den Standort basierend auf der Verfügbarkeit von Mobilfunkmasten und WLAN-Zugangspunkten. Die Ergebnisse werden mittels einer Netzwerksuche abgerufen.LocationManager.PASSIVE_PROVIDER
- Dieser Anbieter gibt Standorte zurück, die von anderen Anbietern generiert wurden. Sie erhalten passiv Standortaktualisierungen, wenn andere Anwendungen oder Dienste diese anfordern, ohne die Standorte selbst anzufordern.Der Kern davon ist, dass Sie ein Objekt
LocationManager
vom System erhalten, das implementierenLocationListener
und dasrequestLocationUpdates
auf dem aufrufenLocationManager
.Hier ist ein Code-Snippet:
Googles API-Handbuch zu Standortstrategienerklärt den Code ziemlich gut. Sie erwähnen jedoch auch, dass Sie in den meisten Fällen eine bessere Akkuleistung sowie eine angemessenere Genauigkeit erzielen, wenn Sie stattdessen die Google Location Services-API verwenden. Jetzt beginnt die Verwirrung!Die Location Services-API von Google ist Teil der Google Play Services-APK ( hier erfahren Sie , wie Sie sie einrichten ). Sie basieren auf der Android-API. Diese APIs bieten anstelle der oben genannten Anbieter einen "Fused Location Provider". Dieser Anbieter wählt automatisch den zugrunde liegenden Anbieter aus, basierend auf Genauigkeit, Batterieverbrauch usw. Er ist schnell, da Sie den Standort von einem systemweiten Dienst erhalten, der ihn ständig aktualisiert. Außerdem können Sie erweiterte Funktionen wie Geofencing verwenden.
Um die Ortungsdienste von Google nutzen zu können, muss Ihre App eine Verbindung zu herstellen
GooglePlayServicesClient
. Um eine Verbindung zum Client herzustellen, müssen Ihre Aktivitäten (oder Fragmente oder so) implementiertGooglePlayServicesClient.ConnectionCallbacks
undGooglePlayServicesClient.OnConnectionFailedListener
Schnittstellen eingerichtet werden. Hier ist ein Beispielcode:locationClient.getLastLocation()
null?Der
locationClient.getLastLocation()
ruft den letzten bekannten Standort vom Client ab. Der Fused Location Provider behält jedoch nur dann den Hintergrundspeicherort bei, wenn mindestens ein Client mit ihm verbunden ist. Sobald der erste Client eine Verbindung herstellt, versucht er sofort, einen Standort zu ermitteln. Wenn Ihre Aktivität der erste Client ist, der eine Verbindung herstellt, und SiegetLastLocation()
sofort anrufenonConnected()
, reicht dies möglicherweise nicht aus, um den ersten Standort zu erreichen. Dies führt dazu, dass dies der Falllocation
istnull
.Um dieses Problem zu lösen, müssen Sie (auf unbestimmte Zeit) warten, bis der Anbieter den Standort erhält, und dann anrufen
getLastLocation()
, was nicht zu wissen ist. Eine andere (bessere) Option besteht darin, diecom.google.android.gms.location.LocationListener
Schnittstelle zu implementieren , um regelmäßige Standortaktualisierungen zu erhalten (und sie auszuschalten, sobald Sie die erste Aktualisierung erhalten).In diesem Code überprüfen Sie, ob der Client bereits den letzten Speicherort (in
onConnected
) hat. Wenn nicht, fordern Sie Standortaktualisierungen an und schalten die Anforderungen (imonLocationChanged()
Rückruf) aus, sobald Sie eine Aktualisierung erhalten.Beachten Sie, dass sich das
locationClient.requestLocationUpdates(locationRequest, this);
imonConnected
Rückruf befinden muss, sonst erhalten Sie eine,IllegalStateException
weil Sie versuchen, Standorte anzufordern, ohne eine Verbindung zum Google Play Services-Client herzustellen.Oft hat der Benutzer die Ortungsdienste deaktiviert (um Batterie zu sparen oder aus Datenschutzgründen). In einem solchen Fall fordert der obige Code weiterhin Standortaktualisierungen an, wird jedoch
onLocationChanged
niemals aufgerufen. Sie können die Anforderungen stoppen, indem Sie überprüfen, ob der Benutzer die Ortungsdienste deaktiviert hat.Wenn Ihre App erfordert, dass sie Ortungsdienste aktivieren, möchten Sie eine Nachricht oder einen Toast anzeigen. Leider gibt es keine Möglichkeit zu überprüfen, ob der Nutzer die Ortungsdienste in der Google-Ortungsdienst-API deaktiviert hat. Dazu müssen Sie auf die Android-API zurückgreifen.
In Ihrer
onCreate
Methode:Und verwenden Sie das
locationEnabled
Flag in IhreronConnected
Methode wie folgt:AKTUALISIEREN
Das Dokument wird aktualisiert, LocationClient wird entfernt und die API unterstützt die Aktivierung von GPS mit einem Klick aus dem Dialogfeld:
Link https://developer.android.com/training/location/change-location-settings#prompt
Neuer Standortclient: FusedLocationProviderClient
Es wird empfohlen, https://developer.android.com/training/location zu durchsuchen, bevor Sie Standortaufgaben ausführen.
quelle
SettingsApi.checkLocationSettings()
damit überprüfen, ob der Benutzer die Ortungsdienste aktiviert hat (siehe hier: developer.google.com/android/reference/com/google/android/gms/… ).LocationManager
! Funktioniert die API für fusionierte Standorte auf Geräten ohne Google Play-Dienste?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 }
Nach meiner Erfahrung bedeutet "angemessenere Genauigkeit" keineswegs besser. Wenn Sie nicht sicherstellen möchten, dass GPS verwendet wird, ist LocationManager der einzige Weg. Wir verfolgen Fahrzeuge mit unserer App und, sofern mir nichts fehlt, bietet Google Play Services häufig sehr ungenaue Standorte.
quelle
Sie sollten die Standort-API von Google Play Services anstelle von LocationManager verwenden. Laut den Dokumenten:
Google sagt, warum Sie wechseln sollten:
quelle
Ich verwende die Google Location Services-API seit einiger Zeit. Es hat Vorteile, da es die Komplexität mehrerer Quellen zur Positionsbestimmung zusammenfasst. Es ist jedoch zu stark gekapselt , sodass Sie bei einer seltsamen Position nicht feststellen können, woher diese seltsame Position stammt.
Im wirklichen Leben sind mehrere Freak-Werte aufgetaucht, die 10 Kilometer von der tatsächlichen Position entfernt sind. Die einzige Erklärung ist, dass diese verrückten Orte auf Fehler in Googles Wi-Fi- oder NWK-Datenbanken zurückzuführen sind - Fehler, die immer vorhanden sein werden, da sich die Wi-Fi- und Netzwerktopologien täglich ändern. Leider (und überraschenderweise) gibt Ihnen die API keine Informationen darüber, wie eine einzelne Position abgeleitet wurde.
Dies führt zu den Problemen, dass Sie Freak-Werte herausfiltern müssen, die auf der Plausibilitätsprüfung von Geschwindigkeit, Beschleunigung, Peilung usw. basieren.
... oder kehren Sie zur guten alten Framework-API zurück und verwenden Sie nur GPS. Dies habe ich beschlossen, bis Google die fusionierte API verbessert.
quelle
Die Google Location Services-API , die Teil von Google Play Services ist, bietet ein leistungsfähigeres Framework auf hoher Ebene, das Standortanbieter , Benutzerbewegungen und Standortgenauigkeit automatisch verwaltet. Es verwaltet auch die Planung von Standortaktualisierungen basierend auf den von Ihnen angegebenen Stromverbrauchsparametern. In den meisten Fällen erzielen Sie mithilfe der Location Services-APIeine bessere Akkuleistung sowie eine angemessenere Genauigkeit.
Detailliertere Unterschiede zwischen der beiden APIs Google Play Service Location API und der Android Framework Location API finden Sie hier
quelle
Ja, die Location Services-API von Google Play Services kann sehr irreführende Standortinformationen liefern. WiFi-Modems werden verschoben, WiFi-Modems werden mit falschen Standortinformationen aktualisiert (dh wenn der Standort von einem Android-Gerät gefälscht wird, das den Standort des WiFi-Modems aktualisiert), und es gibt eine Vielzahl anderer Umstände, die zu falschen Standortdaten aus der WiFi-Modem-Triangulation führen können. In allen unseren Apps, in denen ein genauer Standort erforderlich ist, verwenden wir nur GPS.
quelle
Unterschiede zwischen den beiden APIs Google Play Service Location API und Android Framework Location API basierend auf dem GPS-Dienst
FusedLocationProviderClient
requestLocationUpdates()
Abrufen wird die Methode zum Abrufen des Speicherorts verwendet.locationRequest.setInterval(milliseconds)
undsetFastestInterval(milliseconds)
nicht auf der Änderung des BenutzerstandortsLocationManager Api
Der Standortabruf basiert auf der Änderung des Benutzerstandorts und den Zeitintervallen
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, milliseconds, mindistance, Mylocationlistener)
Der zurückgegebene LatLng-Wert enthält 14 Dezimalwerte (z. B. 11.94574594963342 79.81166719458997) mit genauen Positionswerten
quelle