Предыстория
Прежде чем говорить о самой теме, об использовании геолокации в Android, имеет смысл рассказать о жанре игры, которая предполагается к разработке.
Фитнес-игра – целый жанр игр, преимущественно для мобильных устройств, способствующих поддержанию здоровья игрока. Этот жанр позволяет игрокам геймифицировать процесс своих тренировок в том или ином виде: какие-то игры рассчитаны на конкретную активность, другие – позволяют комбинировать разные занятия. Третьи – предлагают свои собственные виды активности для игрока.
Часто такого рода игры обладают минимально достаточным пользовательским интерфейсом и тесной интеграцией с устройствами отслеживания состояния игрока, включая, но не ограничиваясь данными с датчиков умных устройств (браслеты, весы, часы, телефон, и т. д.)
Из известных игр такого жанра можно назвать Zombies, Run! (2012), Ingress (2013), Pokémon Go (2016).
Примерно такую игру и предполагается разработать.
Постановка задачи
Для начала нами были расписаны технические риски, с которыми можно столкнуться при разработке. Каждый из этих рисков является отдельным пунктом в списке базового функционала игры. Блок функционала был назван «риском» потому, что при его реализации могут возникнуть непредвиденные трудности, влекущие за собой разного рода риски.
Ниже представлены базовые блоки функционала:
Обработка геолокации
Управление воспроизведением аудио
Движение игрока по сюжетной линии
Ядро управления геймификацией активности
Базовый пользовательский интерфейс
Отслеживание и ограничение длительности игровой сессии
Околостудийная запись звукового сопровождение сюжетных линий
Подписки и геолокация
Как уже было отмечено, такого рода игры тесно интегрируются с разными датчиками устройств игрока. Для начала мы решили разобраться с геолокацией телефона под управлением ОС Android.
ОС Android позволяет приложениям подписываться на широковещательные сервисные сообщения (Broadcast), которые содержат в себе разные технические атрибуты, например, текущую геолокацию устройства. Здесь и далее будем называть это «подпиской». Для подписки на такие сообщения может потребоваться получить разрешение пользователя.
Для работы с геолокацией устройства в Android есть несколько методов:
Получение текущей геолокации
Подписка на события для заданных геоточек (geofencing)
Получить текущую геолокацию возможно как единоразово (в ручном режиме), так и подписаться на ее обновления (с помощью broadcast).
Подписка на получение текущей геолокации устройства возможна как в фоновом, так и в активном режиме работы приложения.
Все эти методы предполагают наличие соответствующих разрешений для приложения, более того, для работы в фоне начиная с Android Q приложению требуется иметь постоянное уведомление в шторке.
Теперь стоит осветить работу с Geofences – механизмом управления событиями на основе заданных геоточек.
Данный механизм позволяет создать объект geofence (область на карте в форме круга). Он задается координатами своего центра (широта и долгота) и радиусом в метрах. Дальше можно задать события, при наступлении которых будет выполняться требуемое действие.
Доступны следующие типы событий:
Вход в область
Выход из области
Нахождение в области
Все эти события проверяются на основе текущей геолокации устройства, и хотя вручную ее запрашивать не требуется, все равно будут необходимы разрешения на отслеживание геолокации устройства.
Для целей разработки нашей игры нам требуются оба метода работы с геолокацией (постоянное получение и подписка на события geofences).
Результат
В процессе тестирования работы с данными геолокации мы пришли к следующим выводам:
Отслеживание геолокации устройства в фоне может производиться механизмом подписки с очень высокой частотой, т.к. этот механизм задает частоту опроса датчиков геолокации и ускоряет генерацию broadcast с текущей геолокацией.
При постоянном движении спокойным шагом существует погрешность в точности текущей геолокации до 16 метров, которая по мере замедления снижается.
Частота проверки и обработки событий geofences зависит от частоты получения broadcast с текущей геолокацией. Так, при отключении фонового отслеживания геолокации, скорость обработки событий geofences снижается за счет снижения частоты опроса датчиков геолокации. (см. п. 1)
Погрешность в точности геолокации влияет на ошибки в обработке событий geofences (устройство могло физически пройти сквозь заданную область, но событие не было вызвано).
Дальнейшие шаги
Основной задачей является снижение рисков ошибочного определения активности пользователя из-за погрешности в работе GPS и частоты обработки событий geofencing.
В дальнейшем планируем добавить запрос конкретного типа активности пользователя с устройством: ходьба, бег, езда и т. д., что является одной из возможностей платформы Android и так же работает на механизмке broadcast с изменениями текущего типа активности пользователя.
Эти данные будут объединены с текущим контекстом сюжета внутри ядра управления геймификацией активности. Мы назвали его АИД – адаптивный интуитивный движок. На основе всех этих данных он будет управлять процессом игры и поддерживать геймификацию активности игрока. Его реализация – следующая задача после отслеживания активности и повешения точности геолокации.