Запросить разрешения на определение местоположения

Существует несколько способов запросить информацию о местоположении пользователя на 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 требует использования кнопки «Местоположение ». Для получения более подробной информации см. политику использования кнопки «Местоположение» .

Фоновое местоположение

Приложению требуется доступ к местоположению в фоновом режиме, если какая-либо функция приложения постоянно передает данные о местоположении другим пользователям или использует API геозонирования . Вот несколько примеров:

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

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

В 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 метров (160 футов), а иногда достигает точности в несколько метров (10 футов) или даже лучше. Ваше приложение может получать данные о местоположении с такой точностью, если вы объявите разрешение ACCESS_FINE_LOCATION .

Если пользователь предоставляет разрешение на определение приблизительного местоположения , ваше приложение будет иметь доступ только к приблизительному местоположению, независимо от того, какие разрешения на определение местоположения оно указало.

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

Напоминание о предоставлении гранта на определение местоположения.

На Android 10 (уровень API 29) и выше, когда функция вашего приложения впервые обращается к местоположению устройства в фоновом режиме после того, как пользователь разрешил ему такой доступ, система планирует отправку уведомления пользователю. Это уведомление напоминает пользователю, что он разрешил вашему приложению постоянный доступ к местоположению устройства. Пример уведомления показан на рисунке 8.

Проверьте наличие требований к местоположению в зависимостях SDK вашего приложения.

Проверьте, использует ли ваше приложение какие-либо SDK, зависящие от разрешений на определение местоположения, особенно от разрешения ACCESS_FINE_LOCATION . Подробнее об этом можно прочитать в статье в блоге Medium «Как понять поведение зависимостей вашего SDK» .

Дополнительные ресурсы

Для получения дополнительной информации о разрешениях на определение местоположения в Android ознакомьтесь со следующими материалами:

Кодлабс

Видео

Образцы

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