FusedLocationProviderClient иногда дает другое местоположение - PullRequest
0 голосов
/ 07 декабря 2018
 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();
    }

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

1 Ответ

0 голосов
/ 07 декабря 2018

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

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

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

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

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

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

...