Как обновлять местоположение только на основе минимальной точности определения местоположения - PullRequest
0 голосов
/ 13 июня 2019

В настоящее время я разрабатываю приложение для отслеживания местоположения, требующее высокоточных обновлений местоположения. Это мое самое первое приложение, и я мог бы быть над головой, но я учусь на ходу. Точность, которую я получаю от 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());

        }
}

1 Ответ

0 голосов
/ 13 июня 2019

попробуйте

  if (ActivityCompat.checkSelfPermission(DriverMap.this, android.Manifest.permission.ACCESS_FINE_LOCATION)
            != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(
                    DriverMap.this, android.Manifest.permission.ACCESS_COARSE_LOCATION)
            != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(DriverMap.this, new String[]{android.Manifest.
                permission.ACCESS_FINE_LOCATION}, 1);
    } else {
        if (!mMap.isMyLocationEnabled())
           mMap.setMyLocationEnabled(true);

        LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        myLocation = lm.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);

        if (myLocation == null) {
            Criteria criteria = new Criteria();
            criteria.setAccuracy(Criteria.ACCURACY_COARSE);
            String provider = lm.getBestProvider(criteria, true);
            myLocation = lm.getLastKnownLocation(provider);
        }

        if (myLocation != null) {
            latitude = myLocation.getLatitude();
            lonitude = myLocation.getLongitude();
            userLocation = new LatLng(latitude, lonitude);
              mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 12), 1500, null);
             pos = mMap.addMarker(new MarkerOptions().position(userLocation).title("ur loc"));
             pos.setDraggable(true);
              pos.setIcon(BitmapDescriptorFactory.fromResource(R.drawable.car));
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(userLocation, 17));
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...