Кроме того, всякий раз, когда я проверяю разрешение на определение местоположения после этого первоначального сбора данных, оно всегда сообщает мне, что у приложения есть разрешение на определение местоположения, хотя оно все равно не будет собирать никаких данных. . Это проблематично, поскольку я не могу обработать отзыв разрешения в обратном вызове местоположения, если у меня нет возможности узнать, было ли отозвано разрешение.
Если бы я вышел из своего приложения и снова войдите в систему (не уничтожая процесс), оно не будет снова запрашивать разрешение, потому что ОС сообщает приложению, что оно уже предоставлено, но затем, когда запускается FusedLocationProviderClient, он пытается получить точку, но он устарел, и его временная метка относится примерно к тому времени, когда я впервые предоставил разрешение «спрашивать каждый раз».
Главное, что я ищу вот: есть ли способ правильно обрабатывать «Спрашивать каждый раз» в этом сценарии? Или это может быть ошибка FusedLocationProviderClient, которая, несмотря на предоставленное разрешение, не собирает данные, когда выбрано «спрашивать каждый раз»?
Поток моего приложения выглядит как-то вот так:
- Пользователь входит в систему.
- Если пользователю не предоставлено разрешение на определение местоположения, ему будет предложено для этого разрешения.
- При успешном входе в систему запускается мой LocationService, который будет собирать данные о местоположении каждую минуту.
- При успешном выходе из системы сбор данных прекращается
Мой код местоположения выглядит примерно так. Представьте, что этот код вызывается сразу после предоставления разрешения путем выбора «Спрашивать каждый раз».
Код: Выделить всё
private var fusedLocationClient: FusedLocationProviderClient? = null
private lateinit var locationCallback: LocationCallback
...
locationCallback = object : LocationCallback() {
override fun onLocationResult(locRes: LocationResult) {
// I perform the permission check here, and it still says granted, even though it's acting as if it is not
}
}
val locationRequest = LocationRequest.Builder(60000) // 1 minute
.setPriority(HIGH_ACCURACY)
.setMinUpdateIntervalMillis(60000) // 1 minute
.build()
val locationBuilder = LocationSettingsRequest.Builder().addLocationRequest(locationRequest)
val settingsResult = LocationServices.getSettingsClient(appContext).checkLocationSettings(locationBuilder.build())
settingsResult.addOnCompleteListener { locationSettingsTask ->
fusedLocationClient!!.requestLocationUpdates(locationRequest, locationCallback, null)
}
Если вы запустите службу переднего плана, когда активность видна, а затем пользователь переместит ваше приложение в фоновый режим, ваше приложение сможет продолжать получать доступ к данным до тех пор, пока служба переднего плана не остановится. .
В моем приложении страница входа запрашивает разрешение и запускает службу, которая собирает местоположение.
Подробнее здесь: https://stackoverflow.com/questions/791 ... lects-data