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

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

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

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

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

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

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

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

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

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

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

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

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

  • В приложении для обмена местоположением с семьей появилась функция, позволяющая пользователям постоянно делиться своим местоположением с членами семьи.
  • В приложении 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 . Прочитайте пост в блоге Getting to know the behaviors of your SDK dependencies на Medium для получения дополнительной информации.

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

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

Кодовые лаборатории

Видео

Образцы

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