2016-08-03 6 views
2

Ich bin ein wenig hier kämpfen, verwende ich Fused API für das Erhalten von Standortaktualisierungen. Meine Absicht ist, einen Weg auf Karte zu zeichnen, wenn Benutzer geht.Android Fused Standort API gibt ungenau Standort in onLocationChanged

Ich habe realisiert, dass Sie wie folgt vor:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.map_layout, container, false); 

     // some other initialization 
     //.... 
     // 
     if (mGoogleApiClient == null) { 
      mGoogleApiClient = new GoogleApiClient.Builder(mContext) 
        .addConnectionCallbacks(this) 
        .addOnConnectionFailedListener(this) 
        .addApi(LocationServices.API) 
        .build(); 
     } 

     return view; 
    } 

dann fange ich das Zeug durch die Methode folgende

private void startReceivingLocationUpdates() { 
     if (checkGPSPermission() && mGoogleApiClient.isConnected() && !isReceivingLocationUpdates) { 
      LocationRequest locationRequest = new LocationRequest(); 
      locationRequest.setInterval(5000); 
      locationRequest.setFastestInterval(5000); 
      locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
      LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, 
        locationRequest, this); 
      isReceivingLocationUpdates = true; 
     } 
    } 

& Hier erhalte ich die Location Update

@Override 
    public void onLocationChanged(Location location) { 
     if(getDistanceBetweenTwoLacation(mCoordinates.get(mCoordinates.size() - 1), location) > 3d) { 
      for(int i= 0; i < mCoordinates.size(); i++) { 
       Location locationTemp = mCoordinates.get(i); 
       Log.d(TAG, "i => " + i + " Lat => " + String.valueOf(locationTemp.getLatitude()) + " Lng => " + String.valueOf(locationTemp.getLongitude())); 
      } 
      if(mCoordinates.size() > 0) 
       Log.d(TAG, "lat difference is => " + getDistanceBetweenTwoLacation(mCoordinates.get(mCoordinates.size() - 1), location)); 
      mCoordinates.add(location); 
     } 
    } 

Jetzt ist das Problem ist, onLocationChanged gibt Standort mit lat-lng wer Der Unterschied/Abstand vom letzten Standort beträgt ca. 5-90 Meter, auch wenn das Gerät am selben Ort steht. Fehle ich etwas?

btw, hier ist die Methode, die den Abstand von zwei lat-lngs zurück, die ich

private double getDistanceBetweenTwoLacation(Location origin, Location destination) { 
     return origin.distanceTo(destination); 
    } 
+0

Machst du all diese Tests drinnen? Wenn ja, ist es normal, dass es viel herumspringt. Überprüfen Sie den Genauigkeitswert und Sie werden sehen, dass er ziemlich hoch ist, was auf eine große Unsicherheit in der Position hinweist. – alzee

+0

Welche Berechtigung haben Sie im Manifest? –

+0

@ user3137702 ja, ich tue Prüfung drinnen ... –

Antwort

1

Ungenaue verwendet (und Bewegen/Driften/Springen) GPS-Fixes, wenn sie zuhause sehr verbreitet ist. Ohne eine klare Sicht auf den Himmel ist eine genaue GPS-Ortung unmöglich. In Ihrem Location Objekt gibt es eine getAccuracy() Methode, die einen Gleitkommawert zurückgibt. Dieser Wert ist die Genauigkeit der Positionsbestimmung in Metern, mit 68% (1 Standardabweichung) Konfidenz und repräsentiert den Radius eines Kreises.

Während drinnen werden Sie wahrscheinlich einen Genauigkeitswert von 20, 30, vielleicht sogar 50 Meter sehen, während die Lat & Weitsprung innerhalb dieser Entfernung. Im Freien sollte der Genauigkeitswert auf unter 10 Meter, oft unter 5 Meter fallen und Ihre Position wird viel seltener springen.

tl; dr: GPS liefert keine genauen Ergebnisse in Innenräumen.