Как точно рассчитать скорость и расстояние с помощью GPS?Отслеживание местоположения пользователя.Приложение для бега - PullRequest
0 голосов
/ 26 октября 2018

Я хочу сделать приложение для бега, которое отслеживает местоположение пользователя, скорость и пройденное расстояние.В настоящее время я использую API Google Location Services для получения данных GPS, потому что Google рекомендует их на официальном сайте .

Но проблема в том, что я могу получать обновления местоположения только каждые 10 секунд, что нормально, если дело касается только рисования местоположения на карте, но я хочу рассчитать текущую скорость пользователя (км / ч), текущуютемп (мин / м) и рассчитать точное время, когда он делает один круг (1 км или 1 миля).И вот проблема, если я получаю обновления каждые 10 секунд, я не могу точно рассчитать эти параметры.Например, обновление происходит, когда пользователь на 996 м, а через 4 м он сделает один круг.Но следующее обновление не будет доступно в течение 10 секунд, поэтому оно будет, например, на 1010м.И это не то, что пользователь хотел бы иметь ...

Как решить эту проблему?Как вы думаете?

Я использую здесь точную кодовую форму.

Где запрос местоположения выглядит так:

LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(10000);
mLocationRequest.setFastestInterval(5000);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);

С docs :

Приоритет PRIORITY_HIGH_ACCURACY в сочетании с настройкой разрешения ACCESS_FINE_LOCATION, определенной вами в манифесте приложения, и интервалом быстрого обновления 5000 миллисекунд (5 секунд) приводит к тому, чтообъединенный поставщик местоположения для возврата обновлений местоположения с точностью до нескольких футов.Этот подход подходит для картографических приложений, которые отображают местоположение в режиме реального времени.

Но этого недостаточно.Хотя я меняю интервал на меньший, он всегда равен 10 с.

1 Ответ

0 голосов
/ 20 ноября 2018

Используйте этот код для отправки обновлений местоположения каждые 3 секунды.

LocationListener listener = new LocationListener() {
        @Override
        public void onLocationChanged(final Location location) {
            //This will be called when location is changed


        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {

        }

        @Override
        public void onProviderEnabled(String provider) {

        }

        @Override
        public void onProviderDisabled(String provider) {

            Intent i = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(i);

        }
    };

    locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {

    }
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 3000, 0, listener);

Подробнее об этом коде на Github.

...