2017-10-18 2 views
0

Ich benutze Nexus 6p mit Android 7.1.2. Ich habe die Gerätepositionsgenauigkeit auf HIGH_ACCURACY eingestellt. In meinem Code habe ich einen Hintergrunddienst für die Standortaktualisierung mit der API FusedLocation. Wie Sie sehen können, habe ich auch die Priorität der Standortanforderung auf HIGH_ACCURACY gesetzt. Jetzt habe ich es getestet, als das Gerät auf meinem Schreibtisch ohne Bewegungen war und für die meiste Zeit habe ich die gleichen LAT/LONG-Werte und manchmal sah ich eine kleine Änderung mit den LAT/LONG-Werten, obwohl das Gerät bewegte sich nicht. Also druckte ich die Standortgenauigkeit mit der getAccuracy Methode. Die Dokumentation besagt, dass die Methode getAccuracy einen Wert> = 68 zurückgibt. Dies bedeutet, dass die Wahrscheinlichkeit hoch ist, dass sich das Gerät (Benutzer) an diesem Ort befindet. Also habe ich versucht, diese Methode (eine andere Version des Codes unten) zu verwenden und überprüft, ob getAccuracy einen Wert> = 68 zurückgibt und dann die Standortdetails ausdrucken. Rate mal was? es hat nicht so viel geholfen ..Falscher Standort lat/lang

Das nächste, was ich ausprobiert habe, ist das Gerät zu drehen, und ich sah, dass, wenn das Gerät im Landsacpe-Modus mit dem Rücken zu mir war, die Position Lat/Long wurde geändert ich ging nicht überall) und die Genauigkeit erhöht und in einigen Fällen erreichte den Wert von 180.

Also habe ich das nicht verstehen:

Warum manchmal die lat/long Werte des Geräts unterschiedlich sind auch obwohl das Gerät auf dem Schreibtisch liegt und sich nicht bewegt?

Und wie wirkt sich die Rotation auf die Positionsgenauigkeit aus ?!

Mein Code:

public class LocationUpdateService extends Service implements 
     GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener, 
     LocationListener 
{ 

    private GoogleApiClient googleApiClient; 
    private LocationRequest locationRequest; 

    private boolean playsServiceAvailable; 

    private String TAG = getClass().getSimpleName(); 

    @Override 
    public void onCreate() 
    { 
     Log.d(TAG,"onCreate"); 
     super.onCreate(); 

     initRequestLocation(); 

     playsServiceAvailable = checkPlayServicesConnection(); 

     setupLocationApiClient(); 
    } 

    @Nullable 
    @Override 
    public IBinder onBind(Intent intent) 
    { 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     Log.d(TAG, "onStartCommand"); 
     super.onStartCommand(intent,flags,startId); 

     if (!playsServiceAvailable || googleApiClient.isConnected())    
     { 

      return START_STICKY; 
     } 

     setupLocationApiClient(); 

     if (!googleApiClient.isConnected() || !googleApiClient.isConnecting()) 
     { 
      Log.d(TAG, "onStartCommand: googleApiclient.connect()"); 
      googleApiClient.connect(); 
     } 

     return START_STICKY; 
    } 

    @Override 
    public void onDestroy() 
    { 
     Log.d(TAG, "onDestroy"); 

     if (this.playsServiceAvailable && this.googleApiClient != null) 
     { 
      this.googleApiClient.unregisterConnectionCallbacks(this); 
      this.googleApiClient.unregisterConnectionFailedListener(this); 
      this.googleApiClient.disconnect(); 
      this.googleApiClient = null; 
     } 

     super.onDestroy(); 
    } 

    @Override 
    public void onConnected(@Nullable Bundle bundle) 
    { 
     try 
     { 
      LocationServices.FusedLocationApi.requestLocationUpdates(this.googleApiClient, locationRequest, this); 
     } 
     catch (SecurityException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) 
    { 
     googleApiClient = null; 
    } 

    @Override 
    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) 
    { 
    } 

    @Override 
    public void onLocationChanged(Location currentLocation) 
    { 
     Log.d(TAG, "onLocationChanged:\n\t\t\t" + 
       "CurrentLocation:\n\t\t\t\t" + 
       "ACCURACY: " + currentLocation.getAccuracy() + "\n\t\t\t\t" + 
       "LAT: " + currentLocation.getLatitude() + "\n\t\t\t\t" + 
       "LONG: " + currentLocation.getLongitude() + "\n\t\t\t\t" + 
       "TIME: " + currentLocation.getTime()); 

    } 

    private boolean checkPlayServicesConnection() 
    { 
     int resultCode = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context); 

     if (resultCode != ConnectionResult.SUCCESS) 
     { 
      return false; 
     } 
     return true; 
    } 

    private void initRequestLocation() 
    { 
     locationRequest = LocationRequest.create(); 
     locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) 
       .setInterval(5000) 
       .setFastestInterval(1000); 
    } 

    private void setupLocationApiClient() 
    { 
     Log.d(TAG,"setupLocationApiClient"); 
     if (googleApiClient == null) 
      initGoogleApiClient(); 
    } 

    private synchronized void initGoogleApiClient() 
    { 
     Log.d(TAG,"initGoogleApiClient"); 
     googleApiClient = new GoogleApiClient.Builder(this) 
       .addApi(LocationServices.API) 
       .addOnConnectionFailedListener(this) 
       .addConnectionCallbacks(this) 
       .build(); 
    } 
} 

Antwort

3

Dies ist GPS In-Genauigkeit nicht mit Gerät ausgeben. Es versucht, den genauen Standort zu holen, deshalb bewegt es sich hier und da, um die GPS-Genauigkeit zu verbessern. Versuchen Sie, die kleinste Verschiebung und das kleinste Intervall für ein genaueres Ergebnis einzustellen.

mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); 
mLocationRequest.setSmallestDisplacement(27);//27 meter 
mLocationRequest.setInterval(5000); // Update location every 5 seconds 
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, 
mLocationRequest, this); 
+0

Danke Ich werde es versuchen – Elior

+0

Ich bearbeite Antwort auch für Sie. –

+0

Ok .. es scheint zu funktionieren .. Also wenn ich es richtig verstehe .. das SetSmlalestDisplacement wird den Standort nur aktualisieren, wenn es einen Unterschied von 27 Metern (in Ihrem Beispiel) gibt – Elior