#android #kotlin #location #android-doze
#Android #kotlin #Расположение #android-doze
Вопрос:
Я пытаюсь получить текущее местоположение пользователя приложения каждые 2 секунды.
Я уже использую службу переднего плана с уведомлением (могу записывать местоположение, когда приложение находится в фоновом режиме). Но когда приложение переходит в режим ожидания, оно будет продолжать выдавать 3 местоположения после того, как экран станет черным. Но затем перестанет предоставлять мне обновления местоположений.
Я использую FusedLocationProviderClient
, чтобы получить свое текущее местоположение. Я должен WakeLock
поддерживать работу службы, и это работает. Чтобы проверить это, у меня запущена сопрограмма, и я могу это сделать println("test")
, но когда мне нужно мое местоположение, я ничего не получаю.
fusedLocationProviderClient?.getCurrentLocation(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY, cancellationSource?.token)?
.addOnSuccessListener {
val loc = it
println("${loc.latitude},${loc.longitude}")
postNewLocation(loc)
}?.addOnCanceledListener {
println("cancel")
}
Сразу после получения последнего обновления местоположения я получаю это LocationEngineResult == null
.
Кто-нибудь знает, что я делаю не так? Любая помощь или советы были бы полезны.
Для контекста я использую Android 11 с targetsdkversion 30.
Я новичок в kotlin, и это для школьного проекта, который я должен завершить.
Ответ №1:
Вы не можете получать местоположения, когда устройство находится в режиме ожидания. Цитирую комментарий представителя Google по проблеме в Google issue tracker:
местоположение, не доставленное в режиме ожидания, разработано специально. Когда режим ожидания активен, мы прилагаем все усилия для доставки местоположения, то есть мы доставляем местоположение, если телефон все равно просыпается по какой-либо другой причине, но в противном случае мы не будем будить телефон только для доставки местоположения
Примечание:
Вы можете сказать, что режим ожидания не должен влиять на службу переднего плана. Это не так. Это поставщик местоположения, который есть.
Обновить:
Режим ожидания активируется только «если пользователь оставляет устройство отключенным от сети и неподвижным на некоторое время с выключенным экраном». Таким образом, если устройство неподвижно в одном месте, нет необходимости отслеживать местоположение за этот период времени.
Не знаю, является ли режим ожидания вашей проблемой. Оптимизация батареи — еще одна проблема. Для некоторых телефонов поставщики местоположения отключаются, когда включена оптимизация заряда батареи и экран выключен. Вы можете проверить это поведение с помощью PowerManager.getLocationPowerSaveMode()
. Режимы:
- LOCATION_MODE_FOREGROUND_ONLY
- LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF
- LOCATION_MODE_NO_CHANGE
- LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF
Кроме того, некоторые производители телефонов создали телефоны, которые не соответствуют стандартному поведению Android. Проверьте это.
Комментарии:
1. Спасибо за ваш ответ. Но мне интересно, как strava и другие подобные приложения отслеживают местоположение пользователей, когда телефон находится в режиме ожидания?