Чтобы защитить конфиденциальность пользователей, приложения, использующие службы определения местоположения, должны запрашивать разрешения на определение местоположения.
Несколько разрешений связаны с местоположением. Какие разрешения вы запрашиваете и как вы их запрашиваете, зависит от требований местоположения для варианта использования вашего приложения.
На этой странице описываются различные типы требований к местоположению и объясняется, как запросить разрешение на местоположение в каждом случае.
Чтобы запросить разрешения на определение местоположения, следуйте рекомендациям для всех разрешений времени выполнения .
Типы доступа к местоположению
Каждое разрешение имеет комбинацию следующих характеристик:
- Категория : Расположение на переднем плане или на заднем плане .
- Точность : Точное или приблизительное местоположение.
Расположение на переднем плане
Если ваше приложение содержит функцию, которая делится или получает информацию о местоположении только один раз или в течение определенного периода времени, то эта функция требует доступа к местоположению на переднем плане. Вот некоторые примеры:
- В навигационном приложении появилась функция, позволяющая пользователям получать пошаговые инструкции.
- В приложении для обмена сообщениями появилась функция, позволяющая пользователям делиться своим текущим местоположением с другими пользователями.
Система считает, что ваше приложение использует данные о местоположении на переднем плане, если функция вашего приложения получает доступ к текущему местоположению устройства в одной из следующих ситуаций:
- Видна активность, принадлежащая вашему приложению.
Ваше приложение запускает службу переднего плана. Когда служба переднего плана запущена, система повышает осведомленность пользователя, показывая постоянное уведомление. Ваше приложение сохраняет доступ, когда оно находится в фоновом режиме, например, когда пользователь нажимает кнопку « Домой» на своем устройстве или выключает дисплей своего устройства.
Кроме того, вам следует объявить тип службы переднего плана
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 можно найти в следующих материалах:
Кодовые лаборатории
Видео
Образцы
- Пример приложения , демонстрирующего использование разрешений на определение местоположения.