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

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

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

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

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

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

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

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

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

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

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

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

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

Кодлабы

Видео

Образцы

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