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();
}
}
Danke Ich werde es versuchen – Elior
Ich bearbeite Antwort auch für Sie. –
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