2016-02-17 8 views
10

Ich habe eine Anwendung entwickelt, die verwendet wird, um den aktuellen Standort des Geräts zu finden. Ich habe die Fused Location API verwendet, um den aktuellen Standort zu ermitteln.Anwendung bekommen falschen Ort, bis öffnen eingebaut Google Map-Anwendung

ich sehr seltsame Frage bin vor, ich in einigen Geräten bin nicht genau aktuellen Standort bekommen, bis ich integrierte Google Map öffnen, sobald ich Google Map öffnen und wieder zu meiner Anwendung zu diesem Zeitpunkt Anwendung genauen Standort zurückzukehren.

Hier ist meine Standortanfrage.

mLocationRequest = new LocationRequest(); 
mLocationRequest.setInterval(UPDATE_INTERVAL); 
mLocationRequest.setFastestInterval(FATEST_INTERVAL); 
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationRequest.setSmallestDisplacement(DISPLACEMENT); // 10 meters 

Kann mir jemand sagen, was ist los? Ihre Hilfe wird sehr geschätzt.

+0

Was ist Ihr Location? –

+3

Komm schon, du hast 33k Punkte. Soll ich die konkreten Werte erraten? Bitte stelle es in die Frage nicht in die Kommentare. Wurde die hohe Genauigkeit in den Telefoneinstellungen aktiviert? Wie viele Standortaktualisierungen haben Sie erhalten? An welchen Geräten haben Sie getestet? Was ist die Version der GMS-Bibliothek? Alles, was dir einfällt, hilft. –

+1

Mitglied seit 5 Jahren, immer noch Posting Code in den Kommentaren. Oh Junge ... – 2Dee

Antwort

3

Also Waze und wir verwendeten FusedLocation in der Vergangenheit und viele Probleme konfrontiert. Die API ist defekt. Es gibt einige Geräte, die nicht richtig funktionieren. Activity-Erkennung, die eine Menge Relais funktioniert nicht funktioniert und Personal richtig erkennen. Wir beenden, um zurück zum Location Manager API zu wechseln.

Hier ist der Code-Schnipsel:

Init-Aufnahmeleiter und starten Sie das Updates auf anderen Thread zu beantragen. melde ich mich persönlich separaten Hörer für jeden Anbieter

if (mLocationManager == null) { 
     LOGGER.info("Location track,start called first time. Creating Location Manager"); 
     mLocationManager = (LocationManager) mContextWeakReference.get() 
       .getSystemService(Context.LOCATION_SERVICE); 

     mLocationHandlerThread 
       = new HandlerThread("LocationThread", Thread.NORM_PRIORITY); 
     mLocationHandlerThread.start(); 
     // Now get the Looper from the HandlerThread 
     // NOTE: This call will block until the HandlerThread gets control and initializes its Looper 
     Looper looper = mLocationHandlerThread.getLooper(); 
     Location networkLastKnownLocation = null; 
     Location gpsLastKnownLocation = null; 
     mGpsLocationListener = new GpsLocationListener(); 
     mNetworkLocationListener = new NetworkLocationListener(); 

     // Register the listener with the Location Manager to receive location updates 
     if (mLocationManager.getAllProviders().contains(LocationManager.GPS_PROVIDER)) { 
      mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
        LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS, 
        mGpsLocationListener, 
        looper); 

      gpsLastKnownLocation = mLocationManager 
        .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     } else { 
      setGpsProviderAvailable(false); 
     } 
     if (mLocationManager.getAllProviders().contains(LocationManager.NETWORK_PROVIDER)) { 
      networkLastKnownLocation = mLocationManager 
        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
      mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
        LOCATION_REQUEST_INTERVAL_MILLIS, SMALLEST_DISPLACEMENT_METERS, 
        mNetworkLocationListener, 
        looper); 
     } 

     setLastKnownLocationDifferentProviders(gpsLastKnownLocation, 
       networkLastKnownLocation); 

    } 

Und die Zuhörer sind:

public class GpsLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     LOGGER.info("Location track ,onLocationChanged location={}", location); 
     switch (location.getProvider()) { 
      case LocationManager.GPS_PROVIDER: 
       if (mLocationManager != null) { 
        mLocationManager.removeUpdates(mNetworkLocationListener); 
       } 
       break; 
     } 
     setLastKnownLocation(location); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     LOGGER.info("onStatusChanged: {}, status: {}", provider, status); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     LOGGER.info("onProviderEnabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(true); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     LOGGER.info("onProviderDisabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(false); 
     } 
    } 
} 

public class NetworkLocationListener implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     LOGGER.info("Location track ,onLocationChanged location={}", location); 
     switch (location.getProvider()) { 
      case LocationManager.NETWORK_PROVIDER: 
       setLastKnownLocation(location); 
       break; 
     } 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     LOGGER.info("onStatusChanged: {}, status: {}", provider, status); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     LOGGER.info("onProviderEnabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(true); 
     } 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     LOGGER.info("onProviderDisabled: " + provider); 
     if (provider.equals(LocationManager.GPS_PROVIDER)) { 
      setGpsProviderAvailable(false); 
     } 
    } 
} 

Sie vergessen haben, nicht alle Themen deregistrieren und zu stoppen :)

+0

Benötige ich immer einen separaten Thread für diesen Listener? Mein Benutzer läuft relativ langsam, und ich brauche keine häufigen Updates. Außerdem wird der Speicherort einfach zur weiteren Verarbeitung verschoben: Es bleibt nichts auf dem UI-Thread hängen. –

+0

Eine andere Frage: Es gibt diese ganze Weisheit, wie man "falsche" Standortaktualisierungen herausfiltern kann. –

+1

1. Nein. Sie benötigen dazu keinen separaten Thread. Sie können den gleichen UI-Thread verwenden, um OnLocationChange 2. Es ist die ganze andere Geschichte :) Muss Buch schreiben, wie Sie schlechte Standorte herausfiltern –

0

Ich bin mir nicht sicher, aber zuletzt hatte ich so etwas gesehen, das Telefon hatte kein dediziertes GPS. Es hatte nur ein GPS.

Nachdem ich lange Zeit herumgespielt hatte, wurde mir klar, dass dies der Grund war, warum ich keine genaue Position bekam. Aber nach dem Öffnen der Karten war der Ort aus irgendeinem Grund korrekt. Google macht definitiv viele andere Dinge in Karten, um genaue Position auf Karten zu erhalten, selbst wenn das Telefon nicht dediziertes GPS hat. Überprüfen Sie einfach die Geräte und deren Hardware-Spezifikationen.

0

Beim Erstellen von LocationRequest müssen Sie setPriority() auf PRIORITY_NO_POWER gesetzt haben.

PRIORITY_NO_POWER bedeutet, dass Ihre App niemals einen Standort erhält, es sei denn, eine andere App im Telefon hat Standorte angefordert und empfangen. Lesen Sie mehr unter LocationRequest.

+0

Sie zeigen, wie das Problem zuverlässig * reproduziert * werden kann, nicht wie es behoben werden kann. –

0

Testen Sie auf Marshmallow oder über Version Gerät?
In Geräten über Lollipop müssen Sie zur Laufzeit eine Standortberechtigung anfordern. Verweise auf diesen Link http://developer.android.com/training/permissions/requesting.html
So hättest du keine Standorterlaubnis, daher würde es keinen genauen Ort zurückgeben, aber wenn du deine Map-App startest, die bereits GPS-Erlaubnis hat, wird dein Standort im Google Play-Service aktualisiert. Daher wird auch der korrekte Standort angezeigt, da der Standort schließlich vom Google Play-Dienst abgerufen wird.

+0

Das ist nicht korrekt. Die App ist als Targeting Lollipop markiert, und daher funktionieren auch auf Marshmallow die Berechtigungen auf die alte Art und Weise. Ortsaktualisierungen kommen auch an, nur weniger genau als mit Maps. Auch, wenn ich von fusioniert zu GPS-Location-Provider wechseln, funktionieren die Updates gut. –