Запросить данные о местоположении пользователя на устройстве Android можно разными способами. Выбор зависит от конкретной ситуации. В этом руководстве описаны различные сценарии доступа к данным о местоположении и объясняется, как запрашивать разрешения на доступ к данным о местоположении в каждом случае.
Для начала ознакомьтесь с рекомендациями по работе со всеми динамическими разрешениями, а также с общими советами по минимизации запросов разрешений.
Типы доступа к местоположению
Каждое разрешение имеет комбинацию следующих характеристик:
- Категория. Доступ к данным о местоположении в активном режиме или доступ к данным о местоположении в фоновом режиме.
- Точность. Точное или приблизительное местоположение.
Доступ к данным о местоположении в активном режиме
Если в приложении есть функция, которая передает или получает данные о местоположении только один раз или в течение определенного времени, то ей требуется доступ к данным о местоположении в активном режиме. Вот несколько примеров:
- В навигационном приложении есть функция, которая позволяет пользователям получать пошаговые инструкции.
- В мессенджере есть функция, которая позволяет пользователям делиться своим текущим местоположением с другими пользователями.
Система считает, что приложение использует данные о местоположении в активном режиме, если функция приложения получает доступ к текущему местоположению устройства в одной из следующих ситуаций:
- Действие, которое относится к вашему приложению, видно.
Приложение использует активную службу. Когда активная служба запущена, система показывает пользователю постоянное уведомление. Приложение сохраняет доступ, когда оно работает в фоновом режиме, например когда пользователь нажимает кнопку Главный экран или выключает экран устройства.
Кроме того, в манифесте необходимо объявить тип активной службы
location, как показано в следующем фрагменте кода. В Android 10 (уровень API 29) и более поздних версиях необходимо объявить этот тип активной службы.<!-- Recommended for Android 9 (API level 28) and lower. --> <!-- Required for Android 10 (API level 29) and higher. --> <service android:name="MyNavigationService" android:foregroundServiceType="location" ... > <!-- Any inner elements would go here. --> </service>
Чтобы запросить доступ к данным о местоположении в активном режиме, добавьте в приложение разрешение ACCESS_COARSE_LOCATION или ACCESS_FINE_LOCATION, как показано в следующем фрагменте кода:
<manifest ... >
<!-- Always include this permission -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<!-- Include only if your app benefits from precise location access. -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>
Однократный доступ. В некоторых вариантах использования, помимо доступа к данным о местоположении в активном режиме, требуется доступ к местоположению пользователя только в определенные моменты удобства использования приложения, а не постоянное обновление в течение всего времени использования приложения. В таких случаях в приложениях должна использоваться кнопка геолокации, чтобы запрашивать доступ к местоположению для отдельного сеанса использования приложения. Кроме того, если ваше приложение предназначено для Android 17 (уровень API 37) или более поздней версии и содержит только функции, требующие доступа к данным о местоположении на основе сеанса, правила Google Play требуют, чтобы вы использовали кнопку геолокации. Подробную информацию можно найти в правилах в отношении кнопки геолокации.
Доступ к геоданным в фоновом режиме
Доступ к данным о местоположении в фоновом режиме требуется, если функция в приложении постоянно передает информацию о местоположении другим пользователям или использует Geofencing API. Вот несколько примеров:
- В приложении для семейного доступа к геоданным есть функция, которая позволяет пользователям постоянно делиться своим местоположением с членами семьи.
- В приложении для IoT есть функция, которая позволяет пользователям настраивать устройства умного дома так, чтобы они выключались, когда пользователь уходит из дома, и включались, когда он возвращается.
Считается, что приложение использует доступ к данным о местоположении в фоновом режиме, если оно получает доступ к текущему местоположению устройства в любой ситуации, кроме описанных в разделе Доступ к данным о местоположении в активном режиме. Точность определения местоположения в фоновом режиме такая же, как и в активном, и зависит от разрешений на доступ к геоданным, которые запрашивает приложение.
В Android 10 (уровень API 29) и более поздних версиях необходимо объявить разрешение ACCESS_BACKGROUND_LOCATION в манифесте приложения, чтобы запрашивать доступ к данным о местоположении в фоновом режиме во время выполнения. В более ранних версиях Android приложение, получившее доступ к данным о местоположении в активном режиме, автоматически получает доступ к данным о местоположении в фоновом режиме.
<manifest ... >
<!-- Required only when requesting background location access on
Android 10 (API level 29) and higher. -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
</manifest>
Точность
Android поддерживает следующие уровни точности геолокации:
- Приблизительно
- Предоставляет приблизительное местоположение устройства. Если местоположение определяется по
LocationManagerServiceилиFusedLocationProvider, точность оценки составляет около 3 квадратных километров (около 1,2 квадратных миль). Приложение может получать данные о местоположении с такой точностью, если вы запрашиваете разрешениеACCESS_COARSE_LOCATION, но неACCESS_FINE_LOCATION. - Точное
- Предоставляет максимально точные данные о местоположении устройства.
Если местоположение определяется по
LocationManagerServiceилиFusedLocationProvider, погрешность обычно составляет около 50 метров, а иногда – всего несколько метров. Приложение может получать данные о местоположении с таким уровнем точности, если вы объявите разрешениеACCESS_FINE_LOCATION.
Если пользователь предоставит доступ к данным о приблизительном местоположении, то приложение сможет получать только их, независимо от того, какие разрешения в нем запрашиваются.
Приложение должно работать, даже если пользователь разрешил доступ только к приблизительному местоположению. Если для работы функции в приложении требуется доступ к точному местоположению с помощью разрешения ACCESS_FINE_LOCATION, вы можете попросить пользователя предоставить приложению доступ к точному местоположению.
Напоминание о предоставлении доступа к данным о местоположении в фоновом режиме
На устройствах с Android 10 (уровень API 29) и более поздних версий, когда функция в вашем приложении впервые получает доступ к данным о местоположении в фоновом режиме после того, как пользователь предоставил такое разрешение, система планирует отправку уведомления пользователю. Это уведомление напоминает пользователю, что он разрешил вашему приложению постоянный доступ к данным о местоположении устройства. Пример уведомления показан на рисунке 8.
Проверьте, есть ли требования к местоположению в зависимостях SDK вашего приложения
Проверьте, использует ли ваше приложение SDK, которым требуется доступ к данным о местоположении, особенно разрешение ACCESS_FINE_LOCATION. Дополнительную информацию можно найти в статье Getting to know the behaviors of your SDK dependencies (Знакомство с поведением зависимостей SDK) на сайте Medium.
Дополнительные ресурсы
Дополнительную информацию о разрешениях на доступ к данным о местоположении в Android можно найти в следующих материалах:
Практические работы
Видео
Образцы
- Пример приложения, в котором показано, как использовать разрешения на доступ к данным о местоположении.