Android-устройство стабильно работает только в одном месте, но иногда проезжает больше 2 км.

Я разрабатываю приложение, в которое я передаю текущее местоположение пользователя с помощью FusedLocationProviderClient. что-то вроде кода ниже. Я не могу понять, почему он принимает текущее местоположение как другое местоположение, иногда оно 2+KM далеко от текущего местоположения, и устройство просто стабильно находится в одном месте.

private void getLastLocation() {
        try {
            mFusedLocationClient.getLastLocation()
                    .addOnCompleteListener(new OnCompleteListener<Location>() {
                        @Override
                        public void onComplete(@NonNull Task<Location> task) {
                            if (task.isSuccessful() && task.getResult() != null) {
                                mLocation = task.getResult();

                                onNewLocation(mLocation);

                            } else {
                                Log.e(TAG, "Failed to get location.");
                                mLocation = null;
                            }
                        }
                    });




        } catch (SecurityException unlikely) {
            //Log.e(TAG, "Lost location permission." + unlikely);
        }

Вышеприведенный код находится в службе переднего плана... Теперь проблема заключается в том, что пользовательское устройство стабильно, но после 5-6 часов работы приложения оно возвращает другое текущее местоположение, даже если устройство находится в том же месте (без движения)

Фактический результат: он не должен давать мне ни одного километра, пройденного пользователем. мой км, пройденный пользователем, выглядит примерно так: код ниже

double distanceInMeters = currentLocation.distanceTo(priviusLocation);

                    if (distanceInMeters > getSharedPref.getDefaultDistance() && (mLocation.getAccuracy() < Config.ACCURACY ) //Config.ACCURACY==>70{
//                if (distanceInMeters > getSharedPref.getDefaultDistance()) {//getSharedPref.getDefaultDistance()==>10
                        if (mLocation.getLatitude() > 0) {
                            getSharedPref.setPreviousLocation(String.valueOf(mLocation.getLatitude()), String.valueOf(mLocation.getLongitude()));
                            writeDataInLogFile("this set to previous ", String.valueOf(mLocation.getLatitude()) + "  getLongitude " + String.valueOf(mLocation.getLongitude()));
                        }
                        data.setGPS_Km_Travelled(String.format("%.2f", distanceInMeters / 1000));
                        data.setGPS_Is_Loc_Changed("1");

                    }

person Android Dev    schedule 19.08.2019    source источник


Ответы (1)


Принцип работы объединенного провайдера местоположения заключается в том, что он объединяет данные GPS устройства, а также сетевую информацию от Google с использованием информации о сотовой сети устройства и WiFi, а также, возможно, другую информацию с вашего устройства.

Иногда случается так, что когда вы оставляете устройство в зоне, где связь с GPS практически отсутствует, положение пользователя определяется с помощью сетевой информации с устройства. Иногда точность составляет 30 м, но иногда позиция, указанная поставщиком объединенных местоположений, может быть неточной до нескольких километров. Из-за этого ваше приложение может подумать, что устройство переместилось, так как текущее местоположение изменилось, даже если физическое устройство никогда не перемещалось.

Чтобы это исправить, вам необходимо реализовать алгоритм фильтрации полученных позиций по определенным критериям. Например, если положение имеет значение «точности» выше, чем, возможно, до 100 м, то его даже не стоит рассматривать как действительное местоположение, поскольку пользователь может фактически находиться на расстоянии до 3 км от местоположения, которое возвращает API. Кроме того, если текущее местоположение пользователя находится слишком далеко от последнего местоположения, вам следует проверить, можно ли доверять новому местоположению как точному (человек обычно не может двигаться со скоростью более нескольких км/ч).

Удачи в ваших начинаниях!

person Hbibna    schedule 19.08.2019
comment
Да, я сделал то же самое, проверьте мой код, если (distanceInMeters › getSharedPref.getDefaultDistance() && (mLocation.getAccuracy() ‹ Config.ACCURACY ) //Config.ACCURACY==›70{ - person Android Dev; 20.08.2019
comment
Возможно, ваше приложение накапливает небольшие смещения с точностью до ‹ 70 м. Вы можете получать обновления местоположения только в том случае, если ваше устройство переместилось на определенное расстояние. Перейдите по следующей ссылке на официальную документацию: developers.google.com/android/reference/com/google/android/gms/ Также проверьте этот ответ для справки: stackoverflow.com/questions/35249408/ - person Hbibna; 20.08.2019