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

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

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

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

Для запроса разрешений на доступ к местоположению следуйте рекомендациям по настройке всех разрешений во время выполнения .

Типы доступа к местоположению

Каждое разрешение обладает сочетанием следующих характеристик:

Местоположение на переднем плане

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

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

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

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

    Кроме того, необходимо объявить тип службы переднего плана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>

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

Приложению требуется доступ к местоположению в фоновом режиме, если какая-либо функция приложения постоянно передает данные о местоположении другим пользователям или использует 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 ознакомьтесь со следующими материалами:

Кодлабс

Видео

Образцы

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