Как реализовать регулярное снятие координат в мобильном приложении на Android 10 и выше

Программист 1С v8.3 (Управляемые формы) Торговля и дистрибуция
← На главную

С выходом Android 10 и последующих версий разработчики мобильных приложений столкнулись с серьезными ограничениями в области фонового сбора геоданных. Система в целях энергосбережения и приватности жестко ограничивает доступ к GPS, если приложение не активно. Рассмотрим подробно, как обеспечить стабильный трекинг для торговых агентов или сервисных служб в современных реалиях мобильной платформы 1С и ОС Android.

Проблема фонового режима в современных версиях Android

Начиная с Android 10, система вводит политику ограничения частоты запросов местоположения в фоновом режиме. Даже если приложение запущено, но пользователь переключился на другую задачу или заблокировал экран, доступ к GPS может быть ограничен до нескольких раз в час. В Android 11 и выше ситуация усугубилась появлением разрешений типа "Разрешить только во время использования приложения". Чтобы приложение могло получать координаты в фоне, пользователь должен вручную выбрать опцию "Разрешить в любом режиме" в глубоких настройках системы, что не всегда очевидно.

Разберем основные технические решения, которые позволяют обойти эти ограничения и обеспечить качественный трекинг.

Решение 1: Использование Foreground Service (Служба переднего плана)

Проанализируем наиболее надежный технический путь — создание Foreground Service. Это специальный тип сервиса в Android, который показывает постоянное уведомление в "шторке" телефона. Для операционной системы это сигнал: "Приложение выполняет важную работу, которую нельзя прерывать".

Для реализации в среде 1С нам потребуется Внешняя компонента (ВК), написанная на Java или Kotlin в Android Studio. Рассмотрим логику работы такой компоненты:

  1. Компонента запускает отдельный поток (Service), который живет независимо от жизненного цикла графической оболочки 1С.
  2. В манифесте приложения (AndroidManifest.xml) необходимо явно указать разрешение ACCESS_BACKGROUND_LOCATION и тип сервиса foregroundServiceType="location".
  3. Сервис обращается к Fused Location Provider API — это современный интерфейс Google, который эффективно комбинирует данные со спутников, Wi-Fi и сотовых вышек.

Важный нюанс: использование Foreground Service гарантирует, что система не "прибьет" процесс через 5 минут простоя, однако это требует наличия постоянно висящего стикера в уведомлениях, что может раздражать пользователей, но является необходимым компромиссом для бизнес-задач.

Решение 2: Обход вендорских "оптимизаторов" (Xiaomi, Samsung, Huawei)

Часто проблема кроется не в самом чистом Android, а в надстройках производителей. Выясним причину, почему даже правильно написанный сервис может перестать работать. Бренды вроде Xiaomi (MIUI) или Huawei используют агрессивные менеджеры питания, которые закрывают любые фоновые процессы для экономии заряда.

Проанализируем шаги, которые должен выполнить пользователь (торговый агент) для стабильной работы трекинга:

  1. Зайти в настройки приложения -> "Контроль активности".
  2. Выбрать режим "Нет ограничений".
  3. В настройках системы разрешить приложению "Автозапуск".
  4. Закрепить приложение в меню запущенных программ ("замочек").

Без этих манипуляций системный "оптимизатор" выгрузит мобильный клиент 1С из памяти, как только агент положит телефон в карман.

Решение 3: Гибридный метод снятия координат (Check-in и активные сессии)

Если полноценный фоновый трек реализовать не удается или он слишком сильно разряжает батарею, рассмотрим гибридный подход. Выясним, как оптимизировать процесс получения данных без ущерба для точности.

Посмотрим на алгоритм работы при обработке заказа:


// Пример логики в мобильном приложении 1С
Процедура ПриНачалеРаботыСЗаказом()
    ПараметрыОпроса = Новый СредстваГеопозиционированияПараметрыОпроса;
    ПараметрыОпроса.ОбновлятьПриИзмененииМестоположения = Истина;
    ПараметрыОпроса.ПериодичностьОбновления = 60; // раз в минуту
    
    СредстваГеопозиционирования.НачатьОбновлениеМестоположения(ПараметрыОпроса);
КонецПроцедуры

Проанализируем ситуацию: если агент зашел внутрь здания, спутники могут быть недоступны. В этом случае рекомендуется использовать данные от провайдера Network (сотовые вышки). Проверим показатель Точность (Accuracy). Если она составляет более 100-200 метров, такие координаты можно считать предварительными. В 1С это реализуется через проверку свойств объекта ДанныеГеопозиционирования.

Рациональное предложение: если при нажатии кнопки "Check-in" (приезд на точку) координаты не удалось получить мгновенно, приложение должно взвести флаг "Ожидание координат" и продолжать попытки опроса, пока пользователь заполняет документы. В момент выхода на открытое пространство или поднесения телефона к окну, координаты будут зафиксированы.

Решение 4: Использование Geofencing API

Современным и эффективным методом является использование Геозон (Geofencing). Вместо того чтобы постоянно запрашивать GPS-координаты и тратить ресурс процессора, мы передаем операционной системе Android список координат торговых точек и радиус (например, 100 метров).

Система сама отслеживает перемещение устройства на низком уровне потребления энергии. Как только телефон пересекает границу указанного круга, Android "будит" наше мобильное приложение и передает событие входа в зону. Это позволяет автоматически отмечать посещение торговой точки без ведения непрерывного трека, что крайне положительно сказывается на заряде батареи.

Рекомендации по работе с точностью и энергопотреблением

Рассмотрим важные аспекты работы с GPS-чипом, чтобы избежать перегрева устройства и быстрой разрядки:

  1. Не лочите основной поток: Всегда используйте асинхронные методы (коллбэки) для получения координат. Прямое ожидание (таймаут) в основном потоке приведет к зависанию интерфейса приложения.
  2. Фильтрация данных: При получении координат проверяйте их "свежесть" (timestamp). Android может вернуть закэшированную координату десятиминутной давности, если свежая еще не определена.
  3. Оптимизация провайдеров: Сначала пробуйте получить координаты по базовым станциям (LBS), и только если их точность недостаточна для бизнес-логики, включайте полноценный GPS.

Посмотрим на пример обработки точности в коде:


Данные = СредстваГеопозиционирования.ПолучитьПоследнееМестоположение();
Если Данные <> Неопределено Тогда
    Если Данные.Точность < 50 Тогда
        // Координата достаточно точная для фиксации визита
        ЗаписатьКоординату(Данные.Широта, Данные.Долгота);
    Иначе
        // Пробуем запустить более точный поиск
        СредстваГеопозиционирования.ОбновитьМестоположение(30); // таймаут 30 сек
    КонецЕсли;
КонецЕсли;

Подводя итог, можно сказать, что реализация качественного трекинга на Android 10+ требует комплексного подхода: написания нативной внешней компоненты для 1С, правильной настройки прав доступа (Background Location) и обучения пользователей настройке параметров энергосбережения своих смартфонов.

← На главную