Какие подводные камни при получении точных геокоординат в Android раз в полчаса
Androidгеолокацияоптимизация батареиразработка приложенийточные координаты
Что проверяют
Знаете ли вы ограничения фоновой работы в современных Android и понимаете ли, что «раз в полчаса» и «точно» в фоне сочетаются плохо. Следом обычно спрашивают, чем запускать задачу: WorkManager, AlarmManager или foreground service.
Как отвечать
Разложите задачу на разрешения, планирование и получение самой точки:
- разрешения: с Android 10 для фона нужен
ACCESS_BACKGROUND_LOCATION, с Android 11 его запрашивают отдельно, и выдаётся оно в настройках. С Android 12 пользователь может дать только приблизительное местоположение вместоACCESS_FINE_LOCATION. Google Play требует обосновать фоновый доступ; - планирование:
PeriodicWorkRequestна 30 минут подходит, но это не расписание, а «не чаще чем». В Doze и редких standby buckets задача ждёт окна обслуживания. Точные будильники с Android 12 требуютSCHEDULE_EXACT_ALARM, а на Android 14 это разрешение по умолчанию не выдаётся; - foreground service: если нужна гарантия, остаётся сервис с уведомлением и
foregroundServiceType="location", с Android 14 ещё и сFOREGROUND_SERVICE_LOCATION. Из фона с Android 12 его, как правило, не запустить; - сама точка:
getLastLocation()может вернуть старую точку илиnull. НуженgetCurrentLocation()уFusedLocationProviderClientсPriority.PRIORITY_HIGH_ACCURACYи таймаутом. Холодный старт GPS занимает десятки секунд, в помещении фикса может не быть, поэтому проверяйтеaccuracyи возраст точки; - батарея: дорог не запрос раз в полчаса, а долгое ожидание фикса при плохом сигнале. Ограничивайте время и берите лучшую точку из полученных;
- окружение: выключенную геолокацию проверяют через
SettingsClient, для устройств без Google Play Services нужен запасной путь черезLocationManager.
Где спотыкаются
Предлагают корутину с delay(30.minutes) в фоне. Процесс убьют задолго до этого.
Забывают про прошивки производителей, которые убивают фон сверх стандартного Android. Стоит упомянуть проверку на реальных устройствах и исключение приложения из оптимизации батареи.
Запрашивают фоновое и основное разрешения одним диалогом. На Android 11 и новее система такой запрос проигнорирует.