Android Kotlin: получение местоположения, когда приложение находится в режиме ожидания

#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() . Режимы:

  1. LOCATION_MODE_FOREGROUND_ONLY
  2. LOCATION_MODE_GPS_DISABLED_WHEN_SCREEN_OFF
  3. LOCATION_MODE_NO_CHANGE
  4. LOCATION_MODE_THROTTLE_REQUESTS_WHEN_SCREEN_OFF

Кроме того, некоторые производители телефонов создали телефоны, которые не соответствуют стандартному поведению Android. Проверьте это.

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

1. Спасибо за ваш ответ. Но мне интересно, как strava и другие подобные приложения отслеживают местоположение пользователей, когда телефон находится в режиме ожидания?

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

3. Хорошо, еще раз спасибо! У меня был друг и сокурсник, которые тестировали приложение, и проблемы, которые, как я думал, у меня были с режимом ожидания, на самом деле были не так. Проблема заключалась в том, что я использовал эмулятор, а не реальное устройство. Еще раз спасибо, что помогли мне