Попытка тайм-аута при вызове requestLocationUpdates при попытке получить последнее обновление местоположения

#android

#Android

Вопрос:

Android Studio 3.4

Я использую FusedLocationProviderClient для получения координат широты и длительности.

Однако сценарий, который я тестирую, заключается в том, что пользователь отключает местоположение в настройках. Обычно это приводит к удалению любых данных о местоположении при повторном включении.

В следующем фрагменте я пытаюсь справиться с этим сценарием, запрашивая обновления местоположения. Однако приложение не получит никаких последних обновлений, и я бы хотел, чтобы время ожидания запроса истекло. Я создал LocationResult с setExpirationDuration мыслью, что это может произойти через 10 секунд, если я установлю его на 10000 мс. Но ничего не произошло.

  private fun getLocationFused() {
        fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this)

        if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED amp;amp;
            ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) !=
                PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.ACCESS_FINE_LOCATION, android.Manifest.permission.ACCESS_COARSE_LOCATION), permissionRequestCode)
        }
        else {
            fusedLocationProviderClient.lastLocation.addOnSuccessListener(this) { location ->
                if(location != null) {
                    forecastPresenter.requestWeatherForecast(location.latitude, location.longitude)
                }
                else {
                    val locationCallback = object : LocationCallback() {
                        override fun onLocationResult(locationResult: LocationResult) {
                            forecastPresenter.requestWeatherForecast(locationResult.lastLocation.latitude, locationResult.lastLocation.longitude)
                            fusedLocationProviderClient.removeLocationUpdates(this)
                        }
                    }

                    val locationResult = LocationRequest()
                    locationResult.maxWaitTime = 10000
                    fusedLocationProviderClient.requestLocationUpdates(locationResult, locationCallback, null)
                }
            }.addOnFailureListener(this) {
                println(it.message)
            }.addOnCanceledListener(this) {
                println("Cancelled")
            }
        }
    }
  

Если событие истекло после тайм-аута, какой метод будет вызван? onLocationResult Вернется ли значение nul locationResult ?

Большое спасибо за любые предложения,

Комментарии:

1.Возможно, вы можете попробовать setMaxWaitTime() метод. Согласно документу, он устанавливает максимальное время ожидания в миллисекундах для обновлений местоположения. developers.google.com/android/reference/com/google/android/gms /…

2. @Lodoss, я пробовал это. Но интересно, какое событие я могу зафиксировать после истечения времени ожидания? Будет ли это в случае нулевого результата location в onLocationResult после тайм-аута? Просто интересно, как когда я пробовал, ничего не произошло. Поэтому не удается справиться с проблемой тайм-аута

3. Я только что увидел, что вы завернули свой LocationCallback в OnSuccessListener . Поскольку провайдер не сможет успешно получить местоположение, прослушиватель успеха может не вызываться, верно? Если это так, обновления местоположения вашего запроса не прекратятся. Я не очень знаком с процессом определения местоположения, но, возможно, вы можете попытаться удалить прослушиватель успеха. Также обратитесь к этому tuto .

4. @Lodoss Я обновил свой ответ. Я думаю, вы правы насчет того, что LocationCallBack в OnSuccessListener я добавил addOnFailureListener и addOnCancelledListener , которые связаны, однако тайм-аут не срабатывает failureListener и cancelledListener .

5. @Lodoss В принципе, то, что я пытаюсь сделать, это просто обработать тайм-аут, чтобы приложение не зависало в ожидании успешного определения местоположения. В течение периода тайм-аута, если я открою карты Google, onLocationResult сработает с обновленным местоположением. Однако в моем случае я просто хочу установить тайм-аут примерно через 10 секунд, если местоположение не обновляется.