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

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

С местоположением связано множество разрешений. То, какие разрешения и как вы их запрашиваете, зависит от требований к местоположению для вашего приложения.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Codelabs

Видео

Образцы

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