Задержка LocationManager для получения данных GPS

У меня возникают проблемы с задержкой на некоторых телефонах при получении данных GPS. Координаты берутся, когда пользователь нажимает на некоторые поля, которым требуется местоположение пользователя для проверки данных. Телефоны Моторола работают нормально. При тестировании с телефонами OnePlus 3T (A3000) и LG задержка получения телефона GPS составляет от 12 до 15 секунд, независимо от того, какого провайдера я выбираю и где находится пользователь (гараж, дом, офис). И неважно, сколько раз пользователь отвечает на одно и то же поле.

Я прочитал ссылки:

Получение слишком большой задержки от слушателя OnLocationChange.?

Почему Android LocationManager имеет большую задержку перед определением местоположения обновления начинаются, если задана точность

Стратегии определения местоположения

Под кодом:

public void getLocation(final LocationListener locationListener) {
        if (locationListener == null) return;
        LocationRequest locationRequest = new LocationRequest();
        locationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
        locationRequest.setInterval(500);
        locationRequest.setFastestInterval(500);

        LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
                .addLocationRequest(locationRequest)
                .setAlwaysShow(true);

        GoogleApiClient googleApiClient = new GoogleApiClient.Builder(this)
                .addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        googleApiClient.connect();
        PendingResult<LocationSettingsResult> result = LocationServices.SettingsApi
                .checkLocationSettings(googleApiClient, builder.build());

        result.setResultCallback(new ResultCallback<LocationSettingsResult>() {

            @Override
            public void onResult(@NonNull LocationSettingsResult locationSettingsResult) {
                final Status status = locationSettingsResult.getStatus();
                Criteria criteria = new Criteria();
                criteria.setAccuracy(Criteria.ACCURACY_COARSE);
                criteria.setSpeedRequired(true);
                criteria.setAltitudeRequired(false);
                criteria.setBearingRequired(false);
                criteria.setCostAllowed(true);
                switch (status.getStatusCode()) {
                    case LocationSettingsStatusCodes.SUCCESS:
                        LocationManager locationManager =
                                ((LocationManager) getSystemService(Context.LOCATION_SERVICE));

                        showError("NETWORK: "+ locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER));
                        showError("GPS: "+locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER));

                        String provider = locationManager.getBestProvider(criteria, true);

                        if (App.isVersionGreaterThanLollipop()){
                            if (ActivityCompat.checkSelfPermission(
                                    ChecklistActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)
                                    == PackageManager.PERMISSION_GRANTED) {
                                Location loc = locationManager.getLastKnownLocation(provider);
                                currentLcoation = loc;
                                showError("BEST PROVIDER: "+provider+" CURRENT LOCATION: " +loc.getLatitude()+" "+loc.getLongitude());
                                locationManager.requestSingleUpdate(
                                        criteria, locationListener, null);
                            }
                            else {
                                requestLocationPermission(locationListener);
                            }
                            ...
                        }
    ...

Независимо от того, заставлю ли я NETWORD_PROVIDER получить быстрое местоположение, он продолжает задерживаться.

Как я могу получить данные GPS, преодолев эту задержку?


person learner    schedule 06.11.2017    source источник
comment
Получение исправлений GPS часто связано с задержкой. Иногда задержка может быть неопределенной (например, пользователь находится в здании, которое блокирует сигналы GPS, например, в гараже). Это то, с чем вы просто должны иметь дело. Помимо этого... Stack Overflow предназначен для вопросов по программированию. Какой у Вас вопрос?   -  person CommonsWare    schedule 06.11.2017
comment
@CommonsWare Я считаю, что эти исправления можно получить с помощью requestLocationUpdates, а не с onRequestSingleUpdate. А на телефонах Motorola, Sony почти мгновенно. Я не могу понять, почему это происходит в одних телефонах, а не в других.   -  person learner    schedule 06.11.2017
comment
Разные телефоны имеют разные части, в том числе разные GPS-радио. GPS-радио имеет разное качество.   -  person CommonsWare    schedule 06.11.2017
comment
Ok. Так решение есть?   -  person learner    schedule 06.11.2017
comment
Нет другого решения, кроме как признать, что исправления GPS могут быть задержаны или никогда не приходить из-за условий окружающей среды. Ваше приложение должно с этим справляться. Это не сильно отличается от других ситуаций, которые ваше приложение должно иметь возможность решать (например, отсутствие подключения от приложения, которое хочет общаться с сервером).   -  person CommonsWare    schedule 06.11.2017