FusedLocationProviderClient.requestLocationUpdates недавно начал зависать, пока приложение находится в фоновом режимеAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 FusedLocationProviderClient.requestLocationUpdates недавно начал зависать, пока приложение находится в фоновом режиме

Сообщение Anonymous »

В течение нескольких лет я использую FusedLocationClient.requestLocationUpdates для получения данных о местоположении с устройства. В прошлом месяце (не знаю точно, когда) этот метод внезапно начал зависать, когда приложение работало в фоновом режиме. Теперь это происходит на всех устройствах и во всех версиях приложений, которые ранее работали.
Как только приложение снова оказывается на переднем плане, процедура возобновляется, и обратный вызов местоположения вызывается правильно.
p>
Раньше у меня было подобное поведение, если мне не было предоставлено разрешение ACCESS_BACKGROUND_LOCATION. Однако в данном случае у меня есть такое разрешение.
Мой код местоположения выполняется в Worker примерно каждую минуту. Имейте в виду, что многие строки были опущены, чтобы сделать этот пост простым. Если я упустил что-то важное, я могу добавить это здесь.

Код: Выделить всё

private var fusedLocationClient: FusedLocationProviderClient? = null
private lateinit var locationCallback: LocationCallback

...

override fun doWork(): Result {

...
fusedLocationClient = LocationServices.getFusedLocationProviderClient(appContext)

locationCallback = object : LocationCallback() {
override fun onLocationResult(locRes: LocationResult) {
/* this is what's never getting reached when the app is in the background */
}
}

val locationRequestBuilder = LocationRequest.Builder(1000)
.setPriority(Priority.PRIORITY_HIGH_ACCURACY)

val locationBuilder = LocationSettingsRequest.Builder().addLocationRequest(locationRequestBuilder.build())

val settingsResult = LocationServices.getSettingsClient(appContext).checkLocationSettings(locationBuilder.build())

settingsResult.addOnCompleteListener { response ->
fusedLocationClient!!.requestLocationUpdates(locationRequestBuilder.build(), locationCallback, null)
}

...

}
Когда я впервые унаследовал эту кодовую базу, для выполнения этой задачи использовалась служба переднего плана, которая работала нормально до тех пор, пока обновление Android 12 не ограничило службы переднего плана: это обновление не позволяет нам запускать эту службу переднего плана. из фона, что необходимо из-за того, как Служба была построена, когда я изначально унаследовал ее: она выполняет краткосрочную задачу (сбор местоположения), планирует себя, а затем снова выполняется в запланированное время, а затем повторяется. Этот поток не мог продолжаться без запуска службы в фоновом режиме, поскольку приложение можно было свернуть.
На той же странице рекомендовалось использовать диспетчер работ вместо службы переднего плана, что заставило меня переключиться с сервиса на работника. В любом случае то, что пытался сделать сервер, похоже, больше соответствует тому, что должен делать работник. Казалось, до какого-то момента в прошлом месяце это работало нормально.
Теоретически я мог бы переместить все обратно в службу переднего плана, а затем изменить службу так, чтобы она работала непрерывно, а не делать это один раз. задачу и планирование себя снова и снова, но я стараюсь избегать такого серьезного рефакторинга, если это возможно.
Моя главная цель — заставить его выполнять свои краткосрочные задачи, и планирование самого себя, как это происходит уже почти 7 лет. Но если этот подход больше невозможен, я просто стисну зубы и проведу его рефакторинг.
Что я пробовал:
  • Приложение удалено и переустановлено.
  • Проверено на версиях SDK до 28 (в SDK 28 оно делает то же самое, что и в SDK 34 или 35).
  • Очистил кеш приложения.
  • Отменил все разрешения и вернул все разрешения (

    Код: Выделить всё

    ACCESS_FINE_LOCATION
    и ACCESS_BACKGROUND_LOCATION
  • Проверено: у меня есть все разрешения на определение местоположения в AndroidManifest.xml
  • Проверено, что батарея экономит заряд не был включен (известно, что такое поведение проявляется, если включена экономия заряда батареи).
  • Проверьте доступность сервисов Google Play (с помощью метода GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(appContext))
  • Заменить использование устаревших методов неустаревшими аналогами


Подробнее здесь: https://stackoverflow.com/questions/791 ... nging-whil
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Android»