webentwicklung-frage-antwort-db.com.de

Android: LocationManager vs Google Play Services

Ich möchte eine App erstellen, bei der der aktuelle Standort des Benutzers ermittelt wird, und dann über die Google Places API Points of Interest (wie Bars, Restaurants usw.) in seiner Nähe gefunden werden.

Beim Durchsuchen des Webs nach einem Startpunkt stieß ich auf einige Tutorials, die die Klasse LocationManager verwenden, und auf einige Tutorials, die Google Play Services verwenden, um den Standort des Benutzers zu ermitteln.

Auf den ersten Blick machen beide dasselbe, aber da ich neu darin bin, war ich ein wenig verwirrt und weiß nicht, welche Methode am besten zu meinen Bedürfnissen passt. Also, ich möchte dich fragen:

Was sind die Unterschiede zwischen diesen beiden Methoden zum Auffinden von Orten (falls vorhanden)?

134
SoCo

User Location auf Android

Das Abrufen des Standorts des Benutzers unter Android ist etwas unkomplizierter als unter iOS. Um die Verwirrung auszulösen, gibt es zwei völlig verschiedene Möglichkeiten. Die erste ist die Verwendung von Android APIs von Android.location.LocationListener, Und die zweite verwendet Google Play Services-APIs com.google.Android.gms.location.LocationListener. Gehen wir beide durch.

  1. Android-Standort-API

    Die Standort-APIs von Android verwenden drei verschiedene Anbieter, um den Standort zu ermitteln:

    • 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 über eine Netzwerksuche abgerufen.
    • LocationManager.PASSIVE_PROVIDER - Dieser Anbieter gibt Standorte zurück, die von anderen Anbietern generiert wurden. Sie erhalten Standortaktualisierungen passiv, wenn andere Anwendungen oder Dienste sie anfordern, ohne die Standorte selbst anzufordern.

Der Kern davon ist, dass Sie ein Objekt von LocationManager vom System erhalten, das LocationListener implementieren und das requestLocationUpdates auf dem LocationManager aufrufen.

Hier ist ein Code-Snippet:

    LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
// Define a listener that responds to location updates
LocationListener locationListener = new LocationListener() {
    public void onLocationChanged(Location location) {
      // Called when a new location is found by the network location provider.
      makeUseOfNewLocation(location);
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {}

    public void onProviderEnabled(String provider) {}

    public void onProviderDisabled(String provider) {}
  };

// Register the listener with the Location Manager to receive location updates
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);

Googles API-Leitfaden zu Standortstrategien erklärt den Code ziemlich gut. Sie erwähnen jedoch auch, dass Sie in den meisten Fällen eine bessere Akkuleistung sowie eine bessere Genauigkeit erzielen, wenn Sie stattdessen Google Location Services API verwenden. Jetzt beginnt die Verwirrung!

  1. Google Location Services-API

Die Location Services-API von Google ist Teil des Google Play Services-APK ( So richten Sie es ein ). Sie basieren auf der API von Android. Diese APIs bieten einen "Fused Location Provider" anstelle der oben genannten Anbieter. Dieser Anbieter wählt basierend auf Genauigkeit, Akkunutzung usw. automatisch den zugrunde liegenden Anbieter aus. Dies ist schnell, da Sie den Standort von einem systemweiten Dienst erhalten, der ihn ständig aktualisiert. Sie können auch erweiterte Funktionen wie Geofencing verwenden.

Um die Standortdienste von Google nutzen zu können, muss Ihre App eine Verbindung zu GooglePlayServicesClient herstellen. Um eine Verbindung zum Client herzustellen, muss Ihre Aktivität (oder ein Fragment) die Schnittstellen GooglePlayServicesClient.ConnectionCallbacks Und GooglePlayServicesClient.OnConnectionFailedListener Implementieren. Hier ist ein Beispielcode:

    public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener {
    LocationClient locationClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        locationClient = new LocationClient(this, this, this);
    }

    @Override
    public void onConnected(Bundle bundle) {
    Location location = locationClient.getLastLocation() ;
        Toast.makeText(this, "Connected to Google Play Services", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onDisconnected() {
    Toast.makeText(this, "Connected from Google Play Services.", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        // code to handle failed connection
        // this code can be found here — http://developer.Android.com/training/location/retrieve-current.html 
    }
  • Warum ist locationClient.getLastLocation() null?

Die Funktion locationClient.getLastLocation() ruft den letzten bekannten Ort vom Client ab. Der Fused Location Provider behält den Hintergrundstandort jedoch nur 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 Sie getLastLocation() direkt in onConnected() aufrufen, reicht die Zeit möglicherweise nicht aus, um den ersten Standort zu erreichen. Dies führt zu location ist null.

Um dieses Problem zu beheben, müssen Sie (unbestimmt) warten, bis der Anbieter den Standort gefunden hat, und dann getLastLocation() aufrufen, was unmöglich zu wissen ist. Eine andere (bessere) Option besteht darin, die Schnittstelle com.google.Android.gms.location.LocationListener Zu implementieren, um regelmäßige Standortaktualisierungen zu erhalten (und sie auszuschalten, sobald Sie die erste Aktualisierung erhalten).

    public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener {
    // . . . . . . . . more stuff here 
    LocationRequest locationRequest;
    LocationClient locationClient;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // . . . . other initialization code
        locationClient = new LocationClient(this, this, this);
    locationRequest = new LocationRequest();
    // Use high accuracy
    locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        // Set the update interval to 5 seconds
    locationRequest.setInterval(UPDATE_INTERVAL);
        // Set the fastest update interval to 1 second
    locationRequest.setFastestInterval(FASTEST_INTERVAL);
    }
    // . . . . . . . . other methods 
    @Override
    public void onConnected(Bundle bundle) {
        Location location = locationClient.getLastLocation();
        if (location == null)
            locationClient.requestLocationUpdates(locationRequest, this);
        else
            Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
    }
    // . . . . . . . . other methods
    @Override
    public void onLocationChanged(Location location) {
        locationClient.removeLocationUpdates(this);
        // Use the location here!!!
    }

In diesem Code prüfen Sie, ob der Client bereits den letzten Standort hat (in onConnected). Wenn nicht, fordern Sie Standortaktualisierungen an und deaktivieren die Anforderungen (in onLocationChanged() callback), sobald Sie eine Aktualisierung erhalten.

Beachten Sie, dass sich die locationClient.requestLocationUpdates(locationRequest, this); innerhalb des onConnected Rückrufs befinden muss. Andernfalls wird ein IllegalStateException angezeigt, da Sie versuchen, Standorte anzufordern, die nicht mit Google Play verbunden sind Services Client.

  • Benutzer hat Ortungsdienste deaktiviert

Häufig wurden die Ortungsdienste für den Benutzer deaktiviert (um Batterie zu sparen oder aus Datenschutzgründen). In einem solchen Fall fordert der obige Code weiterhin Standortaktualisierungen an, aber onLocationChanged wird niemals aufgerufen. Sie können die Anforderungen stoppen, indem Sie prüfen, ob der Benutzer die Ortungsdienste deaktiviert hat.

Wenn Ihre App die Aktivierung von Ortungsdiensten erfordert, möchten Sie eine Nachricht oder einen Toast anzeigen. Leider kann nicht überprüft werden, ob der Nutzer Ortungsdienste in der Google-API für Ortungsdienste deaktiviert hat. Dazu müssen Sie auf die API von Android zurückgreifen.

In Ihrer onCreate Methode:

    LocationManager manager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);
if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
    locationEnabled = false;
    Toast.makeText(getActivity(), "Enable location services for accurate data", Toast.LENGTH_SHORT).show();
}
else locationEnabled = true;

Und verwenden Sie das locationEnabled -Flag in Ihrer onConnected -Methode wie folgt:

    if (location != null) {
    Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show();
}
else if (location == null && locationEnabled) {
    locationClient.requestLocationUpdates(locationRequest, this);
}

dank an Rahul Jiresal

[~ # ~] Update [~ # ~]

Das Dokument wird aktualisiert, LocationClient wird entfernt und die API unterstützt das Aktivieren von GPS mit einem Klick aus dem Dialogfeld:

task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
@Override
public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
    // All location settings are satisfied. The client can initialize
    // location requests here.
    // ...
}
});

task.addOnFailureListener(this, new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        if (e instanceof ResolvableApiException) {
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                ResolvableApiException resolvable = (ResolvableApiException) e;
                resolvable.startResolutionForResult(MainActivity.this,
                        REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException sendEx) {
                // Ignore the error.
            }
        }
    }
});

Link https://developer.Android.com/training/location/change-location-settings#Prompt

Neuer Standort-Client: FusedLocationProviderClient

  private FusedLocationProviderClient fusedLocationClient;

@Override
protected void onCreate(Bundle savedInstanceState) {
    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
}

Es wird empfohlen, https://developer.Android.com/training/location durchzugehen, bevor Sie Standortaufgaben ausführen.

302
pRaNaY

Nach meiner Erfahrung bedeutet "angemessenere Genauigkeit" keineswegs besser. Wenn Sie sicherstellen möchten, dass GPS verwendet wird, ist LocationManager der einzige Weg, es sei denn, mir fehlt etwas. Wir verfolgen Fahrzeuge mit unserer App und, sofern ich nichts verpasse, liefert Google Play Services sehr oft ungenaue Standorte.

29
Kit

Sie sollten die Google Play Services-Standort-API anstelle von LocationManager verwenden. Nach den Dokumenten:

Die Standort-APIs der Google Play-Dienste werden den Android Framework-Standort-APIs (Android.location) vorgezogen, um Ihrer App die Standorterkennung hinzuzufügen. Wenn Sie derzeit Android Framework-Standort-APIs wird dringend empfohlen, so bald wie möglich zu den Standort-APIs der Google Play-Dienste zu wechseln.

In Bezug auf den Grund des Wechsels sagt Google Folgendes:

Die Google Location Services-API, Teil von Google Play Services, bietet ein leistungsfähigeres, übergeordnetes Framework, das Standortanbieter, Benutzerbewegung und Standortgenauigkeit automatisch berücksichtigt. Außerdem wird die Planung der Standortaktualisierung basierend auf den von Ihnen angegebenen Stromverbrauchsparametern ausgeführt. In den meisten Fällen erzielen Sie mit der Location Services-API eine bessere Akkuleistung sowie eine angemessenere Genauigkeit.

26
NoChinDeluxe

Ich verwende die Google Location Services-API seit einiger Zeit. Es hat Vorteile, da es die Komplexität mehrerer Quellen für die Positionsbestimmung zusammenfasst. Es kapselt jedoch zu stark , sodass Sie bei einer ungewöhnlichen Position nicht feststellen können, woher diese ungewöhnliche Position stammt.

Im wirklichen Leben sind mehrere Freak-Werte aufgetaucht, die 10 Kilometer von der tatsächlichen Position entfernt waren. 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 sind, da sich die Wi-Fi- und Netzwerktopologien täglich ändern. Leider (und überraschenderweise) gibt Ihnen die API keine Auskunft darüber, wie eine einzelne Position abgeleitet wurde.

enter image description here

Dies führt zu Problemen beim Herausfiltern von Freak-Werten auf der Grundlage von Plausibilitätsprüfungen für Geschwindigkeit, Beschleunigung, Peilung usw.

... oder kehren Sie zur guten alten Framework-API zurück und verwenden Sie nur GPS. Ich habe mich dazu entschlossen, bis Google die fusionierte API verbessert hat.

21
j3App

Die Google Location Services-API, Teil von Google Play Services, bietet ein leistungsfähigeres, übergeordnetes Framework, das automatisch Standort verarbeitet Anbieter, Benutzerbewegung und Ortsgenauigkeit. Außerdem wird die Planung der Standortaktualisierung basierend auf den von Ihnen angegebenen Stromverbrauchsparametern ausgeführt. In den meisten Fällen erhalten Sie bessere Akkuleistung sowie eine bessere Genauigkeit, wenn Sie die Location Services-API verwenden.

Detailliertere Unterschiede zwischen den beiden APIs Google Play Service Location API und Android Framework Location API finden Sie hier

7
Dhruvam Gupta

Ja, die Google Play Services-API für Standortdienste kann sehr irreführende Standortinformationen enthalten. 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 einem falschen Standort führen können Daten von der WiFi-Modem-Triangulation. In all unseren Apps, in denen eine genaue Standortbestimmung erforderlich ist, wird nur GPS verwendet.

1
user1608385

Unterschiede zwischen den beiden APIs Google Play Service Location API und Android Framework Location API basierend auf GPS-Dienst

FusedLocationProviderClient

  1. Für den ersten Abruf darf der Speicherort nicht null sein (d. H .: Einige andere Apps müssen den zuletzt bekannten Speicherort in der GoogleplayService-Datenbank aktualisieren. Wenn er null ist, müssen Sie dies umgehen.)
  2. Für den nächsten sequentiellen Abruf wird die Methode requestLocationUpdates() verwendet, um die Position abzurufen.
  3. Der Standortabruf basiert nur auf locationRequest.setInterval(milliseconds) und setFastestInterval(milliseconds), nicht auf Benutzerstandortänderung
  4. Der zurückgegebene LatLng-Wert enthält nur 7 Dezimalwerte (z. B .: 11.9557996, 79.8234599) nicht so gena
  5. Empfohlen, wenn Ihre App den aktuellen Standort benötigt vernachlässigbare Entfernung von (50 - 100 Metern Genauigkeit)
  6. Wirksam im Akkubetrieb.

LocationManager Api

  1. Der Benutzer-Standortabruf wird mit locationManager.requestLocationUpdates () aufgerufen.
  2. Der Standortabruf basiert auf Benutzer Standortänderung und ZeitintervallelocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, milliseconds, mindistance, Mylocationlistener)

  3. Der zurückgegebene LatLng-Wert enthält 14 Dezimalwerte(z. B .: 11.94574594963342 79.81166719458997genaue Positionswerte

  4. Empfohlen für ortsbezogene Anwendungen, bei denen eine höhere Genauigkeit auch in Metern erforderlich ist.
  5. Der Batterieverbrauch basiert auf Abrufintervall und Abrufentfernung.
0
Sackurise

Location-Manager

Wie in der offiziellen Dokumentation angegeben, können Sie in dieser Klasse die Dienste für einen Standort verwenden, die geografische Position des Geräts regelmäßig aktualisieren oder "Absicht" an Apps senden, um zu sagen, dass das Gerät ist in der Nähe des vorgegebenen Ortes. API erfordert ACCESS_COARSE_LOCATION oder ACCESS_FINE_LOCATION

Google Location API Services

Es ist völlig inkonsistent mit LocationManager, aber was die Echtzeitfunktion betrifft, gibt es einige grundlegende Unterschiede.

Vorteile und Nachteile

Bei den Google Location API Services haben wir im Vergleich zu LocationManager eine deutlich verbesserte Leistung und Stabilität während der Verwendung festgestellt. Beispielsweise gab es ein häufiges Problem, wenn LocationManager frühere Standorte oder Kartenaktualisierungen erhielt, wenn Parameter für den Mindestzeitraum und die Mindestentfernung festgelegt wurden, um die das Gerät für spätere Aktualisierungen verschoben werden muss. Einer der Parameter wurde normalerweise ignoriert. In den Google Location API Services ist dieses Problem nicht aufgetreten. Außerdem verbrauchen die Google Location Services weniger Batteriepulver.

Infolgedessen schnitten die Google Location API Services in allen Fällen besser ab. Es gibt jedoch auch einige Nachteile. Um die Ortungsdienste nutzen zu können, müssen Sie Google Play Services installieren.

Daher funktioniert die Anwendung auf Geräten mit normaler Firmware, die von Google nicht unterstützt werden oder auf denen Google-Dienste nicht verfügbar sind, nicht. Dies ist ein sehr wichtiger Punkt, der berücksichtigt werden muss. Untersuchungen in diesem Bereich haben ergeben, dass die meisten Nutzer nicht über Google Play Services verfügen. Zum Beispiel sind sie in China aufgrund der nationalen Politik nicht verfügbar, und dies ist ein bedeutender Teil des Marktes, der nicht ignoriert werden kann. In diesem Fall müssen Sie sich an LocationManager wenden.

Google Location API Services ist die beste Lösung für die Arbeit mit Karten. Mit dieser API können Sie mit den genauesten Koordinaten und mit minimalen Kosten für mobile Ressourcen arbeiten, sofern der Nutzer Google Play Services installiert hat. Andernfalls ist LocationManager die einzige Lösung.

Lesen Sie mehr hier

0
yoAlex5