Запрос доступа к данным о местоположении

Запросить данные о местоположении пользователя на устройстве 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 можно найти в следующих материалах:

Практические работы

Видео

Образцы

  • Пример приложения, в котором показано, как использовать разрешения на доступ к данным о местоположении.