fusedLocationProviderClient.lastLocation.addOnSuccessListener всегда null - PullRequest
0 голосов
/ 26 апреля 2018

Я только что обновил свой API местоположения, чтобы использовать FusedLocationProviderClient, но у меня возникает эта проблема, когда я выключаю и включаю GPS, я всегда получаю нулевое местоположение:

val fusedLocationProviderClient =
                        LocationServices.getFusedLocationProviderClient(callingActivity)
            fusedLocationProviderClient.flushLocations()
            getLocationRequest()

            checkLocationSettings(callingActivity, turnOnGpsRequestCode, callback) {
                // Location settings successful
                fusedLocationProviderClient.lastLocation
                        .addOnSuccessListener(callingActivity) {
                            location ->
                            // Here location is always null
callback.onCallback(MenumyRadar.RadarStatus.SUCCESS, location)
                        }
                        .addOnFailureListener {
                            callback.onCallback(MenumyRadar.RadarStatus.ERROR_UNKNOWN, null)
                        }
            }

Это не будет работать, пока я не открою другое приложение, которое использует местоположение, например, Google Maps или Uber.

У меня есть подсказка благодаря этому ответу FusedLocationApi.getLastLocation всегда null

И к объяснению Google:

fusedLocationClient.lastLocation .addOnSuccessListener { местоположение: местоположение? -> // Получил последнее известное местоположение. В некоторых редких ситуациях это может быть нулевым. }

Метод getLastLocation () возвращает задачу, которую можно использовать для получения объекта Location с координатами широты и долготы географического положения. Объект местоположения может быть нулевым в следующие ситуации:

Местоположение отключено в настройках устройства. Результат может быть пусто, даже если последнее местоположение было получено ранее Отключение локации также очищает кеш. Устройство никогда не записывалось его местоположение, которое может быть в случае нового устройства или устройства, которое был восстановлен до заводских настроек. Сервисы Google Play на устройство перезапустилось, и активный провайдер локализованного подключения не существует клиент, который запросил местоположение после перезапуска служб. к Чтобы избежать этой ситуации, вы можете создать нового клиента и запросить местоположение обновляет себя. Для получения дополнительной информации см. Получение места Обновления.

Но там не сказано, как с этим справиться, что я могу сделать?

Ответы [ 2 ]

0 голосов
/ 26 июля 2019

Вы можете использовать метод getLocationAvailability () для вашего объекта FusedLocationPrivedClient, и если он возвращает значение true, используйте только метод getLastLocation (), в противном случае используйте метод requestLocationUpdates () следующим образом:

FusedLocationProviderClient fusedLocationProviderClient =
            LocationServices.getFusedLocationProviderClient(InitActivity.this);
    if (ActivityCompat.checkSelfPermission(this.getApplicationContext(),
            android.Manifest.permission.ACCESS_FINE_LOCATION)
            == PackageManager.PERMISSION_GRANTED) {

fusedLocationProviderClient.getLocationAvailability().addOnSuccessListener(new OnSuccessListener<LocationAvailability>() {
                @Override
                public void onSuccess(LocationAvailability locationAvailability) {
                    Log.d(TAG, "onSuccess: locationAvailability.isLocationAvailable " + locationAvailability.isLocationAvailable());
                    if (locationAvailability.isLocationAvailable()) {
                        if (ActivityCompat.checkSelfPermission(InitActivity.this.getApplicationContext(),
                                android.Manifest.permission.ACCESS_FINE_LOCATION)
                                == PackageManager.PERMISSION_GRANTED) {
                            Task<Location> locationTask = fusedLocationProviderClient.getLastLocation();
                            locationTask.addOnCompleteListener(new OnCompleteListener<Location>() {
                                @Override
                                public void onComplete(@NonNull Task<Location> task) {
                                    Location location = task.getResult();                                    
                                }
                            });
                        } else {
                            requestLocationPermissions ();
                        }

                    } else {
fusedLocationProviderClient.requestLocationUpdates(locationRequest, pendingIntent);

                    }

                }
            });
        } else {
            requestLocationPermissions ();
        }
0 голосов
/ 26 апреля 2018

Я нашел решение, это то, что происходит, когда местоположение равно нулю, это означает, что кэш местоположения был очищен, это происходит при выключении GPS, поэтому, когда я включал его, не было последнего местоположения, чтобы получить, что я сделал это было:

checkLocationSettings(callingActivity, turnOnGpsRequestCode, callback) {
                // Location settings successful
                mFusedLocationProviderClient!!.lastLocation
                        .addOnSuccessListener(callingActivity) {
                            location ->
                            if (location == null || location.accuracy > 100) {
                                mLocationCallback = object : LocationCallback() {
                                    override fun onLocationResult(locationResult: LocationResult?) {
                                        stopLocationUpdates()
                                        if (locationResult != null && locationResult.locations.isNotEmpty()) {
                                            val newLocation = locationResult.locations[0]
                                            callback.onCallback(Status.SUCCESS, newLocation)
                                        } else {
                                            callback.onCallback(Status.ERROR_LOCATION, null)
                                        }
                                    }
                                }

                                mFusedLocationProviderClient!!.requestLocationUpdates(getLocationRequest(),
                                        mLocationCallback, null)
                            } else {
                                callback.onCallback(Status.SUCCESS, location)
                            }
                        }
                        .addOnFailureListener {
                            callback.onCallback(Status.ERROR_UNKNOWN, null)
                        }
            }

Если местоположение пустое, начните запрашивать местоположения с помощью обратного вызова и

mFusedLocationProviderClient !!. RequestLocationUpdates (getLocationRequest (), mLocationCallback, null)

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

Иногда бывает так, что при включении GPS местоположение не равно нулю, но точность плохая, поэтому я также проверяю, достаточно ли точна точность определения местоположения (для меня достаточно хорошо 100 метров)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...