FusedLocationProviderClient иногда дает другое местоположение

 public void getDeviceLocation() {
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(getMvpView().getActivity());
        settingsClient = LocationServices.getSettingsClient(getMvpView().getActivity());
        createLocationCallback();
        createLocationRequest();
        buildLocationSettingsRequest();
        startLocationUpdates();
    }


    private void createLocationRequest() {
        locationRequest = new LocationRequest();
        locationRequest.setInterval(UPDATE_INTERVAL_IN_MILLISECONDS);
        locationRequest.setFastestInterval(FASTEST_UPDATE_INTERVAL_IN_MILLISECONDS);
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }


    private void createLocationCallback() {
        getMvpView().showProgressDialog();
        locationCallback = new LocationCallback() {
            @Override
            public void onLocationResult(LocationResult locationResult) {
                super.onLocationResult(locationResult);
                Location currentLocation = locationResult.getLastLocation();
                getMvpView().showSelectedAddress(getAddressFromLatLng(currentLocation.getLatitude(), currentLocation.getLongitude()));
                fusedLocationClient.removeLocationUpdates(locationCallback);
                getMvpView().hideProgressDialog();
            }
        };
    }


    private void buildLocationSettingsRequest() {
        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();
        builder.addLocationRequest(locationRequest);
        locationSettingsRequest = builder.build();
    }


    private void startLocationUpdates() {
        settingsClient.checkLocationSettings(locationSettingsRequest)
                .addOnSuccessListener(getMvpView().getActivity(), locationSettingsResponse -> {

                    if (ActivityCompat.checkSelfPermission(getMvpView().getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getMvpView().getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
                        return;
                    }
                    fusedLocationClient.requestLocationUpdates(locationRequest,
                            locationCallback, Looper.myLooper());

                }).addOnFailureListener(getMvpView().getActivity(), e -> {
            getMvpView().hideProgressDialog();
            getMvpView().showErrorToast(R.string.please_enable_location);
        });
    }


    @SuppressLint("MissingPermission")
    private void startLocationUpdates() {
        settingsClient.checkLocationSettings(locationSettingsRequest)
                .addOnSuccessListener(getMvpView().getActivity(), locationSettingsResponse -> {
                    fusedLocationClient.requestLocationUpdates(locationRequest,
                            locationCallback, Looper.myLooper());

                }).addOnFailureListener(getMvpView().getActivity(), e -> {
            getMvpView().hideProgressDialog();
            getMvpView().showErrorToast(R.string.please_enable_location);
        });
    }


    private String getAddressFromLatLng(double latitude, double longitude) {
        Geocoder geocoder = new Geocoder(getMvpView().getActivity(), Locale.getDefault());
        List<Address> addresses = null;
        try {
            addresses = geocoder.getFromLocation(
                    latitude,
                    longitude,
                    1);
        } catch (IOException e) {
            e.printStackTrace();
        }

        Address address = addresses.get(0);
        StringBuilder addressStringBuilder = new StringBuilder();
        for (int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
            addressStringBuilder.append(address.getAddressLine(i));
        }

        return addressStringBuilder.toString();
    }

Я преобразовал lat, lng в адресный текст, но после того, как я снова запрошу местоположение, адрес изменится, даже если я не переехал из моего текущего местоположения, также включил точность в настройках телефона. Проблема в том, что когда я всегда запрашиваю, он должен дать мне тот же адрес местоположения, если мои координаты lat, lng не изменены.

Некоторое колебание местоположения на основе GPS является нормальным. Это могут быть метры или даже десятки метров. А местоположение на основе сети (вышки сотовой связи) может измениться еще больше, поскольку оно не очень точное. Так что, возможно, геокодирование работает должным образом, но на самом деле координаты меняются достаточно, чтобы повлиять на результат.

Markus Kauppinen 07.12.2018 10:46
4
1
892
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

FusedLocationProviderClient означает объединение сигналов gps и google-translating-receive-wlan-cellphone-tower-signal-to-lat-lon.

Google-translating-receive-wlan-cellphone-tower-signal-to-lat-lon - это неточная эвристика, которая, среди прочего, зависит от того, к какой сотовой вышке подключен ваш под рукой (и где у Google есть широта / долгота для каждой вышки. ) и насколько мощны 3 самые мощные сотовые телефоны.

Если ваш мобильный телефон изменил свое соединение с вышкой мобильного телефона, то для алгоритма googl-s положение вашего телефона изменилось.

Если ваш мобильный телефон может принимать более 3 вышек сотовой связи, самые мощные 3 башни сотовой связи также будут изменяться в зависимости от того, сколько трафика имеет каждая вышка сотовой связи.

Приемник GPS стоит очень много энергии. Когда включена gps-energy-optimisation, могут также возникать проблемы с gps-precision, вызывающие скачок слитого местоположения.

Я усвоил это на собственном горьком опыте, когда впервые выполнял геокэшинг со своим новым мобильным телефоном, и задавался вопросом, почему моя собственная позиция изменилась на карте.

Другие вопросы по теме