В настоящее время я разрабатываю приложение для отслеживания местоположения, требующее высокоточных обновлений местоположения.
Это мое самое первое приложение, и я мог бы быть над головой, но я учусь на ходу.
Точность, которую я получаю от fusedLocationProviderClient при использовании location.distanceTo (), смещается между 15 и 70+ метрами за обновление (интервал 5 секунд) при ходьбе в постоянном темпе.
Есть ли способ повысить точность или установить минимальную точность?
Я нашел методы getAccuracy () и hasAccuracy () в документации, но до сих пор не понял, как я могу использовать эти методы, чтобы избавиться от колеблющейся точности.
РЕДАКТИРОВАТЬ: я столкнулся с возможностью добавления критериев в мой код местоположения.
Не могли бы вы дать мне пример того, как включить это в мой код, чтобы получить неизменно высокую точность?
В качестве альтернативы, было бы лучше изменить мой код для использования исключительно LocationManager и спутников GPS, поскольку все мои сеансы проводятся вне помещения?
@Override
public void onMapReady(GoogleMap googleMap) {
mGoogleMap = googleMap;
mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
mGoogleMap.setMinZoomPreference(8.0f);
mGoogleMap.setMaxZoomPreference(25.0f);
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(3000);
mLocationRequest.setFastestInterval(1000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.ACCESS_FINE_LOCATION)
== PackageManager.PERMISSION_GRANTED) {
//Location Permission already granted
mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
mGoogleMap.setMyLocationEnabled(true);
} else {
//Request Location Permission
checkLocationPermission();
}
}
else {
mFusedLocationClient.requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.myLooper());
mGoogleMap.setMyLocationEnabled(true);
}
}
LocationCallback mLocationCallback = new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
float zoomLevel = mGoogleMap.getCameraPosition().zoom;
List<Location> locationList = locationResult.getLocations();
System.out.println(workoutLocationList);
if (locationList.size() > 0) {
//The last location in the list is the newest
Location location = locationList.get(locationList.size() - 1);
Location lastLocation = location;
locationList.add(location);
workoutLocationList.add(location);
if(workoutLocationList.size() > 1) {
lastLocation = workoutLocationList.get(workoutLocationList.size() - 2);
}
System.out.println(workoutLocationList.size());
for (Location i : workoutLocationList) {
System.out.println(i);
}
System.out.println("current location is: "+ location);
System.out.println("previous location is: "+ lastLocation);
distanceBetweenLocations += location.distanceTo(lastLocation);
workoutTotalDistance+= distanceBetweenLocations;
System.out.println((int)distanceBetweenLocations);
Log.i("MapsActivity", "Location: " + location.getLatitude() + " " + location.getLongitude());
mLastLocation = location;
if (mCurrLocationMarker != null) {
mCurrLocationMarker.remove();
}
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
}
}