Чтобы защитить конфиденциальность пользователей, приложения, использующие службы определения местоположения, должны запрашивать разрешения на определение местоположения.
При запросе разрешений на определение местоположения следуйте тем же рекомендациям, что и для любого другого разрешения во время выполнения . Одним из важных отличий, когда речь идет о разрешениях на местоположение, является то, что система включает в себя несколько разрешений, связанных с местоположением. Какие разрешения вы запрашиваете и как вы их запрашиваете, зависит от требований к местоположению для варианта использования вашего приложения.
На этой странице описаны различные типы требований к местоположению и приведены инструкции о том, как запросить разрешения на определение местоположения в каждом случае.
Типы доступа к местоположению
Каждое разрешение имеет комбинацию следующих характеристик:
- Категория : Местоположение на переднем плане или на заднем плане .
- Точность : либо точное, либо приблизительное местоположение.
Расположение на переднем плане
Если ваше приложение содержит функцию, которая передает или получает информацию о местоположении только один раз или в течение определенного периода времени, то для этой функции требуется доступ к приоритетному местоположению. Некоторые примеры включают следующее:
- В навигационном приложении функция позволяет пользователям получать пошаговые инструкции.
- В приложении для обмена сообщениями есть функция, позволяющая пользователям делиться своим текущим местоположением с другим пользователем.
Система считает, что ваше приложение использует местоположение на переднем плане, если функция вашего приложения обращается к текущему местоположению устройства в одной из следующих ситуаций:
- Видно действие, принадлежащее вашему приложению.
В вашем приложении запущена служба переднего плана. Когда служба приоритетного режима запущена, система повышает осведомленность пользователей, показывая постоянное уведомление. Ваше приложение сохраняет доступ, когда оно находится в фоновом режиме, например, когда пользователь нажимает кнопку «Домой» на своем устройстве или выключает дисплей своего устройства.
Кроме того, рекомендуется объявить приоритетный тип службы
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
, вы можете попросить пользователя разрешить вашему приложению доступ к точному местоположению .
Запросить доступ к местоположению во время выполнения
Если какой-либо функции вашего приложения требуется доступ к местоположению, подождите, пока пользователь не начнет взаимодействовать с этой функцией, прежде чем отправлять запрос на разрешение. Этот рабочий процесс соответствует передовой практике запроса разрешений во время выполнения в контексте, как описано в руководстве, объясняющем, как запрашивать разрешения для приложений .
На рис. 1 показан пример выполнения этого процесса. Приложение содержит функцию «поделиться местоположением», для которой требуется доступ к местоположению на переднем плане. Однако приложение не запрашивает разрешение на определение местоположения, пока пользователь не нажмет кнопку «Поделиться местоположением» .
Пользователь может предоставить только приблизительное местоположение
В Android 12 (уровень API 31) или более поздней версии пользователи могут запросить, чтобы ваше приложение получало только приблизительную информацию о местоположении, даже если ваше приложение запрашивает разрешение времени выполнения ACCESS_FINE_LOCATION
.
Чтобы справиться с этим потенциальным поведением пользователя, не запрашивайте разрешение ACCESS_FINE_LOCATION
само по себе. Вместо этого запросите разрешение ACCESS_FINE_LOCATION
и разрешение ACCESS_COARSE_LOCATION
в одном запросе во время выполнения. Если вы попытаетесь запросить только ACCESS_FINE_LOCATION
, система игнорирует запрос в некоторых выпусках Android 12. Если ваше приложение предназначено для Android 12 или более поздней версии, система регистрирует следующее сообщение об ошибке в Logcat :
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
Когда ваше приложение запрашивает как ACCESS_FINE_LOCATION
, так и ACCESS_COARSE_LOCATION
, диалоговое окно системных разрешений включает следующие параметры для пользователя:
- Точный : позволяет вашему приложению получать точную информацию о местоположении.
- Приблизительно : позволяет вашему приложению получать только приблизительную информацию о местоположении.
На рис. 3 показано, что диалоговое окно содержит визуальную подсказку для обоих вариантов, помогающую пользователю сделать выбор. После того, как пользователь принимает решение о точности местоположения, он нажимает одну из трех кнопок, чтобы выбрать продолжительность предоставления разрешения.
В Android 12 и более поздних версиях пользователи могут перейти к настройкам системы, чтобы установить предпочтительную точность определения местоположения для любого приложения, независимо от целевой версии SDK этого приложения. Это справедливо даже в том случае, если ваше приложение установлено на устройстве под управлением Android 11 или более ранней версии, а затем пользователь обновляет устройство до Android 12 или более поздней версии.
Выбор пользователя влияет на предоставление разрешений
В следующей таблице показаны разрешения, которые система предоставляет вашему приложению, на основе параметров, которые пользователь выбирает в диалоговом окне среды выполнения разрешений:
Точный | Приблизительный | |
---|---|---|
Во время использования приложения | ACCESS_FINE_LOCATION иACCESS_COARSE_LOCATION | ACCESS_COARSE_LOCATION |
Только на этот раз | ACCESS_FINE_LOCATION иACCESS_COARSE_LOCATION | ACCESS_COARSE_LOCATION |
Отрицать | Нет разрешений на определение местоположения | Нет разрешений на определение местоположения |
Чтобы определить, какие разрешения система предоставила вашему приложению, проверьте возвращаемое значение вашего запроса разрешений. Вы можете использовать библиотеки Jetpack в коде, похожем на следующий, или вы можете использовать библиотеки платформы, где вы сами управляете кодом запроса разрешения .
Котлин
val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION))
Ява
ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); Boolean coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION });
Запросить повышение до точного местоположения
Вы можете попросить пользователя обновить доступ к вашему приложению с примерного местоположения до точного. Однако прежде чем просить пользователя обновить доступ вашего приложения к точному местоположению, подумайте, действительно ли вариант использования вашего приложения абсолютно требует такого уровня точности. Если вашему приложению необходимо выполнить сопряжение устройства с соседними устройствами через Bluetooth или Wi-Fi, рассмотрите возможность использования сопряжения сопутствующих устройств или разрешений Bluetooth вместо запроса разрешения ACCESS_FINE_LOCATION
.
Чтобы запросить у пользователя обновление доступа к местоположению вашего приложения с приблизительного до точного, выполните следующие действия:
- При необходимости объясните, почему вашему приложению требуется разрешение .
- Снова запросите разрешения
ACCESS_FINE_LOCATION
иACCESS_COARSE_LOCATION
вместе. Поскольку пользователь уже разрешил системе предоставлять примерное местоположение вашему приложению, на этот раз системное диалоговое окно будет другим, как показано на рисунках 4 и 5 :
Первоначально запрашивайте только местоположение на переднем плане
Даже если некоторые функции вашего приложения требуют доступа к местоположению, вполне вероятно, что только некоторые из них требуют фонового доступа к местоположению. Поэтому рекомендуется, чтобы ваше приложение выполняло дополнительные запросы на получение разрешений на определение местоположения, запрашивая доступ к приоритетному местоположению, а затем доступ к фоновому местоположению. Выполняя дополнительные запросы, вы предоставляете пользователям больше контроля и прозрачности, поскольку они могут лучше понять, каким функциям вашего приложения требуется фоновый доступ к местоположению.
На рис. 6 показан пример приложения, предназначенного для обработки дополнительных запросов. Функции «показать текущее местоположение» и «рекомендовать ближайшие места» требуют доступа к местоположению на переднем плане. Однако только функция «рекомендовать ближайшие места» требует доступа к фоновому местоположению.
Процесс выполнения дополнительных запросов выглядит следующим образом:
Сначала ваше приложение должно направлять пользователей к функциям, требующим доступа к местоположению на переднем плане, таким как функция «поделиться местоположением» на рис. 1 или функция «показать текущее местоположение» на рис. 2.
Рекомендуется отключить доступ пользователей к функциям, требующим доступа к фоновому местоположению, до тех пор, пока ваше приложение не получит доступ к данным о местоположении на переднем плане.
Позже, когда пользователь изучает функции, требующие фонового доступа к местоположению, вы можете запросить доступ к фоновому местоположению .
При необходимости запросите фоновое местоположение.
Содержимое диалогового окна разрешений зависит от целевой версии SDK.
Когда функция вашего приложения запрашивает фоновое местоположение на устройстве под управлением Android 10 (уровень API 29), в диалоговом окне системных разрешений появляется параметр « Разрешить все время» . Если пользователь выберет этот вариант, функция вашего приложения получит фоновый доступ к местоположению.
Однако в Android 11 (уровень API 30) и более поздних версиях системное диалоговое окно не включает параметр «Разрешить постоянно» . Вместо этого пользователи должны включить фоновое расположение на странице настроек, как показано на рисунке 7.
Вы можете помочь пользователям перейти на эту страницу настроек, следуя рекомендациям при запросе разрешения на фоновое местоположение. Процесс предоставления разрешения зависит от целевой версии SDK вашего приложения.
Приложение предназначено для Android 11 или более поздней версии
Если вашему приложению не предоставлено разрешение ACCESS_BACKGROUND_LOCATION
и shouldShowRequestPermissionRationale()
возвращает true
, покажите пользователям обучающий пользовательский интерфейс, который включает в себя следующее:
- Четкое объяснение того, почему функции вашего приложения необходим доступ к фоновому местоположению.
- Видимая пользователем метка параметра настроек, предоставляющая фоновое расположение (например, «Разрешить все время» на рис. 7). Вы можете вызвать
getBackgroundPermissionOptionLabel()
чтобы получить эту метку. Возвращаемое значение этого метода локализовано в соответствии с языковыми предпочтениями устройства пользователя. - Возможность для пользователей отклонить разрешение. Если пользователи откажутся от доступа к фоновому местоположению, они смогут продолжить использовать ваше приложение.
Приложение предназначено для Android 10 или более ранней версии
Когда функция вашего приложения запрашивает фоновый доступ к местоположению, пользователи видят системное диалоговое окно. В этом диалоговом окне есть возможность перейти к параметрам разрешения местоположения вашего приложения на странице настроек.
Если ваше приложение уже следует рекомендациям по запросу разрешений на определение местоположения, вам не нужно вносить какие-либо изменения для поддержки такого поведения.
Пользователь может повлиять на точность определения местоположения в фоновом режиме
Если пользователь запрашивает приблизительное местоположение , выбор пользователя в диалоговом окне разрешений местоположения также применяется к фоновому местоположению. Другими словами, если пользователь предоставляет вашему приложению разрешение ACCESS_BACKGROUND_LOCATION
, но предоставляет только приблизительный доступ к местоположению на переднем плане, ваше приложение также имеет только приблизительный доступ к местоположению в фоновом режиме.
Напоминание о предоставлении фонового местоположения
В Android 10 и более поздних версиях, когда функция вашего приложения впервые получает доступ к местоположению устройства в фоновом режиме после того, как пользователь предоставляет доступ к фоновому местоположению, система планирует отправку пользователю уведомления. Это уведомление напоминает пользователю, что он разрешил вашему приложению постоянно получать доступ к местоположению устройства. Пример уведомления показан на рисунке 8.
Проверьте требования к местоположению в зависимостях SDK вашего приложения.
Проверьте, использует ли ваше приложение какие-либо SDK, зависящие от разрешений местоположения, особенно разрешения ACCESS_FINE_LOCATION
. Прочитайте эту статью на Medium о том , как узнать поведение зависимостей вашего SDK .
Дополнительные ресурсы
Для получения дополнительной информации о разрешениях местоположения в Android просмотрите следующие материалы:
Кодлабы
Видео
Образцы
- Пример приложения , демонстрирующий использование разрешений на определение местоположения.
Чтобы защитить конфиденциальность пользователей, приложения, использующие службы определения местоположения, должны запрашивать разрешения на определение местоположения.
При запросе разрешений на определение местоположения следуйте тем же рекомендациям, что и для любого другого разрешения во время выполнения . Одним из важных отличий, когда речь идет о разрешениях на местоположение, является то, что система включает в себя несколько разрешений, связанных с местоположением. Какие разрешения вы запрашиваете и как вы их запрашиваете, зависит от требований к местоположению для варианта использования вашего приложения.
На этой странице описаны различные типы требований к местоположению и приведены инструкции о том, как запросить разрешения на определение местоположения в каждом случае.
Типы доступа к местоположению
Каждое разрешение имеет комбинацию следующих характеристик:
- Категория : Местоположение на переднем плане или на заднем плане .
- Точность : либо точное, либо приблизительное местоположение.
Расположение на переднем плане
Если ваше приложение содержит функцию, которая передает или получает информацию о местоположении только один раз или в течение определенного периода времени, то для этой функции требуется доступ к приоритетному местоположению. Некоторые примеры включают следующее:
- В навигационном приложении функция позволяет пользователям получать пошаговые инструкции.
- В приложении для обмена сообщениями есть функция, позволяющая пользователям делиться своим текущим местоположением с другим пользователем.
Система считает, что ваше приложение использует местоположение на переднем плане, если функция вашего приложения обращается к текущему местоположению устройства в одной из следующих ситуаций:
- Видно действие, принадлежащее вашему приложению.
В вашем приложении запущена служба переднего плана. Когда служба приоритетного режима запущена, система повышает осведомленность пользователей, показывая постоянное уведомление. Ваше приложение сохраняет доступ, когда оно находится в фоновом режиме, например, когда пользователь нажимает кнопку «Домой» на своем устройстве или выключает дисплей своего устройства.
Кроме того, рекомендуется объявить приоритетный тип службы
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
, вы можете попросить пользователя разрешить вашему приложению доступ к точному местоположению .
Запросить доступ к местоположению во время выполнения
Если какой-либо функции вашего приложения требуется доступ к местоположению, подождите, пока пользователь не начнет взаимодействовать с этой функцией, прежде чем отправлять запрос на разрешение. Этот рабочий процесс соответствует передовой практике запроса разрешений во время выполнения в контексте, как описано в руководстве, объясняющем, как запрашивать разрешения для приложений .
На рис. 1 показан пример выполнения этого процесса. Приложение содержит функцию «поделиться местоположением», для которой требуется доступ к местоположению на переднем плане. Однако приложение не запрашивает разрешение на определение местоположения, пока пользователь не нажмет кнопку «Поделиться местоположением» .
Пользователь может предоставить только приблизительное местоположение
В Android 12 (уровень API 31) или более поздней версии пользователи могут запросить, чтобы ваше приложение получало только приблизительную информацию о местоположении, даже если ваше приложение запрашивает разрешение времени выполнения ACCESS_FINE_LOCATION
.
Чтобы справиться с этим потенциальным поведением пользователя, не запрашивайте разрешение ACCESS_FINE_LOCATION
само по себе. Вместо этого запросите разрешение ACCESS_FINE_LOCATION
и разрешение ACCESS_COARSE_LOCATION
в одном запросе во время выполнения. Если вы попытаетесь запросить только ACCESS_FINE_LOCATION
, система игнорирует запрос в некоторых выпусках Android 12. Если ваше приложение предназначено для Android 12 или более поздней версии, система регистрирует следующее сообщение об ошибке в Logcat :
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
Когда ваше приложение запрашивает как ACCESS_FINE_LOCATION
, так и ACCESS_COARSE_LOCATION
, диалоговое окно системных разрешений включает следующие параметры для пользователя:
- Точный : позволяет вашему приложению получать точную информацию о местоположении.
- Приблизительно : позволяет вашему приложению получать только приблизительную информацию о местоположении.
На рис. 3 показано, что диалоговое окно содержит визуальную подсказку для обоих вариантов, помогающую пользователю сделать выбор. После того, как пользователь принимает решение о точности местоположения, он нажимает одну из трех кнопок, чтобы выбрать продолжительность предоставления разрешения.
В Android 12 и более поздних версиях пользователи могут перейти к настройкам системы, чтобы установить предпочтительную точность определения местоположения для любого приложения, независимо от целевой версии SDK этого приложения. Это справедливо даже в том случае, если ваше приложение установлено на устройстве под управлением Android 11 или более ранней версии, а затем пользователь обновляет устройство до Android 12 или более поздней версии.
Выбор пользователя влияет на предоставление разрешений
В следующей таблице показаны разрешения, которые система предоставляет вашему приложению, на основе параметров, которые пользователь выбирает в диалоговом окне среды выполнения разрешений:
Точный | Приблизительный | |
---|---|---|
Во время использования приложения | ACCESS_FINE_LOCATION иACCESS_COARSE_LOCATION | ACCESS_COARSE_LOCATION |
Только на этот раз | ACCESS_FINE_LOCATION иACCESS_COARSE_LOCATION | ACCESS_COARSE_LOCATION |
Отрицать | Нет разрешений на определение местоположения | Нет разрешений на определение местоположения |
Чтобы определить, какие разрешения система предоставила вашему приложению, проверьте возвращаемое значение вашего запроса разрешений. Вы можете использовать библиотеки Jetpack в коде, аналогичном следующему, или вы можете использовать библиотеки платформы, где вы сами управляете кодом запроса разрешения .
Котлин
val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION))
Ява
ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); Boolean coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION });
Запросить повышение до точного местоположения
Вы можете попросить пользователя обновить доступ к вашему приложению с примерного местоположения до точного. Однако прежде чем попросить пользователя обновить доступ вашего приложения к точному местоположению, подумайте, действительно ли вариант использования вашего приложения абсолютно требует такого уровня точности. Если вашему приложению необходимо выполнить сопряжение устройства с соседними устройствами через Bluetooth или Wi-Fi, рассмотрите возможность использования сопряжения сопутствующих устройств или разрешений Bluetooth вместо запроса разрешения ACCESS_FINE_LOCATION
.
Чтобы запросить у пользователя обновление доступа к местоположению вашего приложения с приблизительного до точного, выполните следующие действия:
- При необходимости объясните, почему вашему приложению требуется разрешение .
- Снова запросите разрешения
ACCESS_FINE_LOCATION
иACCESS_COARSE_LOCATION
вместе. Поскольку пользователь уже разрешил системе предоставлять примерное местоположение вашему приложению, на этот раз системное диалоговое окно будет другим, как показано на рисунках 4 и 5 :
Первоначально запрашивайте только местоположение на переднем плане
Даже если некоторые функции вашего приложения требуют доступа к местоположению, вполне вероятно, что только некоторые из них требуют фонового доступа к местоположению. Поэтому рекомендуется, чтобы ваше приложение выполняло дополнительные запросы на получение разрешений на определение местоположения, запрашивая доступ к приоритетному местоположению, а затем доступ к фоновому местоположению. Выполняя дополнительные запросы, вы предоставляете пользователям больше контроля и прозрачности, поскольку они могут лучше понять, каким функциям вашего приложения требуется фоновый доступ к местоположению.
На рис. 6 показан пример приложения, предназначенного для обработки дополнительных запросов. Функции «показать текущее местоположение» и «рекомендовать ближайшие места» требуют доступа к местоположению на переднем плане. Однако только функция «рекомендовать ближайшие места» требует доступа к фоновому местоположению.
Процесс выполнения дополнительных запросов выглядит следующим образом:
Сначала ваше приложение должно направлять пользователей к функциям, требующим доступа к местоположению на переднем плане, таким как функция «поделиться местоположением» на рис. 1 или функция «показать текущее местоположение» на рис. 2.
Рекомендуется отключить доступ пользователей к функциям, требующим доступа к фоновому местоположению, до тех пор, пока ваше приложение не получит доступ к данным о местоположении на переднем плане.
Позже, когда пользователь изучает функции, требующие фонового доступа к местоположению, вы можете запросить доступ к фоновому местоположению .
При необходимости запросите фоновое местоположение.
Содержимое диалогового окна разрешений зависит от целевой версии SDK.
Когда функция вашего приложения запрашивает фоновое местоположение на устройстве под управлением Android 10 (уровень API 29), в диалоговом окне системных разрешений появляется параметр « Разрешить все время» . Если пользователь выберет этот вариант, функция вашего приложения получит фоновый доступ к местоположению.
Однако в Android 11 (уровень API 30) и более поздних версиях системное диалоговое окно не включает параметр «Разрешить постоянно» . Вместо этого пользователи должны включить фоновое расположение на странице настроек, как показано на рисунке 7.
Вы можете помочь пользователям перейти на эту страницу настроек, следуя рекомендациям при запросе разрешения на фоновое местоположение. Процесс предоставления разрешения зависит от целевой версии SDK вашего приложения.
Приложение предназначено для Android 11 или более поздней версии
Если вашему приложению не предоставлено разрешение ACCESS_BACKGROUND_LOCATION
и shouldShowRequestPermissionRationale()
возвращает true
, покажите пользователям обучающий пользовательский интерфейс, который включает в себя следующее:
- Четкое объяснение того, почему функции вашего приложения необходим доступ к фоновому местоположению.
- Видимая пользователем метка параметра настроек, предоставляющая фоновое расположение (например, «Разрешить все время» на рис. 7). Вы можете вызвать
getBackgroundPermissionOptionLabel()
чтобы получить эту метку. Возвращаемое значение этого метода локализовано в соответствии с языковыми предпочтениями устройства пользователя. - Возможность для пользователей отклонить разрешение. Если пользователи откажутся от фонового доступа к местоположению, они смогут продолжить использовать ваше приложение.
Приложение предназначено для Android 10 или более ранней версии
Когда функция вашего приложения запрашивает фоновый доступ к местоположению, пользователи видят системное диалоговое окно. В этом диалоговом окне есть возможность перейти к параметрам разрешения местоположения вашего приложения на странице настроек.
Если ваше приложение уже следует рекомендациям по запросу разрешений на определение местоположения, вам не нужно вносить какие-либо изменения для поддержки такого поведения.
Пользователь может повлиять на точность определения местоположения в фоновом режиме
Если пользователь запрашивает приблизительное местоположение , выбор пользователя в диалоговом окне разрешений местоположения также применяется к фоновому местоположению. Другими словами, если пользователь предоставляет вашему приложению разрешение ACCESS_BACKGROUND_LOCATION
, но предоставляет только приблизительный доступ к местоположению на переднем плане, ваше приложение также имеет только приблизительный доступ к местоположению в фоновом режиме.
Напоминание о предоставлении фонового местоположения
В Android 10 и более поздних версиях, когда функция вашего приложения впервые получает доступ к местоположению устройства в фоновом режиме после того, как пользователь предоставляет доступ к фоновому местоположению, система планирует отправку пользователю уведомления. Это уведомление напоминает пользователю, что он разрешил вашему приложению постоянно получать доступ к местоположению устройства. Пример уведомления показан на рисунке 8.
Проверьте требования к местоположению в зависимостях SDK вашего приложения.
Проверьте, использует ли ваше приложение какие -либо SDK, которые зависят от разрешений на местоположение, особенно разрешение ACCESS_FINE_LOCATION
. Проконсультируйтесь с этой статьей о том , чтобы узнать поведение ваших зависимостей SDK .
Дополнительные ресурсы
Для получения дополнительной информации о разрешениях на местоположение в Android, просмотрите следующие материалы:
Коделабс
Видео
Образцы
- Образец приложения для демонстрации использования разрешений на местоположение.
Чтобы защитить конфиденциальность пользователей, приложения, которые используют службы местоположения, должны запрашивать разрешения на местонахождение.
Когда вы запрашиваете разрешения на местонахождение, следуйте тем же лучшим практикам, что и для любого другого разрешения на время выполнения . Одно важное отличие, когда дело доходит до разрешений на местоположение, заключается в том, что система включает в себя несколько разрешений, связанных с местоположением. Какие разрешения вы запрашиваете, и как вы их запрашиваете, зависят от требований к местоположению для использования вашего приложения.
На этой странице описываются различные типы требований к местоположению и предоставляют руководство по запросу разрешений на местонахождение в каждом случае.
Типы доступа к местоположению
Каждое разрешение имеет комбинацию следующих характеристик:
- Категория : либо местоположение на переднем плане , либо место на фоне .
- Точность : либо точное местоположение, либо приблизительное местоположение.
Расположение переднего плана
Если ваше приложение содержит функцию, которая делится или получает информацию о местоположении только один раз или в течение определенного количества времени, то эта функция требует доступа к местоположению переднего плана. Некоторые примеры включают следующее:
- В приложении навигации функция позволяет пользователям получать направления по поводу поворота.
- В приложении обмена сообщениями функция позволяет пользователям делиться своим текущим местоположением с другим пользователем.
Система считает, что ваше приложение использует местоположение на переднем плане, если функция вашего приложения обращается к текущему местоположению устройства в одной из следующих ситуаций:
- Занятие, которое принадлежит вашему приложению, видно.
В вашем приложении запущена служба переднего плана. Когда работает служба переднего плана, система повышает осведомленность пользователя, показывая постоянное уведомление. Ваше приложение сохраняет доступ, когда оно помещается в фоновой речь, например, когда пользователь нажимает кнопку «Домой» на своем устройстве или выключает отображение их устройства.
Кроме того, рекомендуется объявить о
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
, вы можете попросить пользователя позволить вашему приложению доступ к точному местоположению .
Запрос на местоположение доступа во время выполнения
Когда функции в вашем приложении нуждается в доступе к местоположению, подождите, пока пользователь не взаимодействует с функцией, прежде чем сделать запрос на разрешение. Этот рабочий процесс следует за наилучшей практикой запроса разрешений во время выполнения в контексте, как описано в руководстве, которое объясняет, как запросить разрешения приложения .
На рисунке 1 показан пример того, как выполнить этот процесс. Приложение содержит функцию «Расположение местоположения», которая требует доступа к местоположению переднего плана. Однако приложение не запрашивает разрешение на местоположение, пока пользователь не выберет кнопку местоположения .
Пользователь может предоставить только приблизительное местоположение
На Android 12 (API -уровне 31) или выше пользователи могут запросить, чтобы ваше приложение извлекало только приблизительную информацию о местоположении, даже если ваше приложение запрашивает разрешение на выполнение ACCESS_FINE_LOCATION
.
Чтобы справиться с этим потенциальным поведением пользователя, не запрашивайте разрешение ACCESS_FINE_LOCATION
само по себе. Вместо этого запросите разрешение ACCESS_FINE_LOCATION
и разрешение ACCESS_COARSE_LOCATION
в одном запросе времени выполнения. Если вы попытаетесь запросить только ACCESS_FINE_LOCATION
, система игнорирует запрос в некоторых выпусках Android 12. Если ваше приложение нацелено на Android 12 или выше, система регистрирует следующее сообщение об ошибке в logCat :
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
Когда ваше приложение запрашивает как ACCESS_FINE_LOCATION
, так и ACCESS_COARSE_LOCATION
, диалоговое окно «Система разрешений» включает в себя следующие параметры для пользователя:
- Точно : позволяет вашему приложению получить точную информацию о местоположении.
- Приблизительно : позволяет вашему приложению получить только приблизительную информацию о местоположении.
На рисунке 3 показано, что диалог содержит визуальный сигнал для обоих параметров, чтобы помочь пользователю выбрать. После того, как пользователь решает о точности местоположения, он нажимает на одну из трех кнопок, чтобы выбрать продолжительность гранта разрешения.
На Android 12 и выше пользователи могут перейти к настройкам системы, чтобы установить предпочтительную точность местоположения для любого приложения, независимо от целевой версии SDK этого приложения. Это верно, даже когда ваше приложение установлено на устройстве, работающем Android 11 или ниже, а затем пользователь обновляет устройство до Android 12 или выше.
Выбор пользователя влияет на разрешение
В следующей таблице показаны разрешения, которые система предоставляет вашему приложению, на основе параметров, которые пользователь выбирает в диалоговом окне «Время выполнения разрешений»:
Точный | Приблизительный | |
---|---|---|
Во время использования приложения | ACCESS_FINE_LOCATION иACCESS_COARSE_LOCATION | ACCESS_COARSE_LOCATION |
Только на этот раз | ACCESS_FINE_LOCATION иACCESS_COARSE_LOCATION | ACCESS_COARSE_LOCATION |
Отрицать | Нет разрешений на местоположение | Нет разрешений на местоположение |
Чтобы определить, какие разрешения предоставили систему вашему приложению, проверьте возвращаемое значение вашего запроса на разрешения. Вы можете использовать библиотеки JetPack в коде, которые похожи на следующее, или вы можете использовать библиотеки платформ, где вы самостоятельно управляете кодом запроса разрешения .
Котлин
val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION))
Ява
ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); Boolean coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION });
Запросите обновление до точного местоположения
Вы можете попросить пользователя обновить доступ вашего приложения из приблизительного местоположения, чтобы точное местоположение. Однако, прежде чем попросить пользователя обновить доступ вашего приложения в точное местоположение, подумайте, требует ли вариант использования вашего приложения абсолютно этот уровень точности. Если вашему приложению необходимо сочетать устройство с близлежащими устройствами через Bluetooth или Wi-Fi, рассмотрите возможность использования сопряжения устройств-устройств или разрешений Bluetooth , вместо того, чтобы запрашивать разрешение ACCESS_FINE_LOCATION
.
Чтобы запросить, чтобы пользователь обновил доступ к местоположению вашего приложения с приблизительного, чтобы точно сделать следующее:
- При необходимости объясните, почему вашему приложению требуется разрешение .
- Запросите разрешения
ACCESS_FINE_LOCATION
иACCESS_COARSE_LOCATION
вместе. Поскольку пользователь уже позволил системе предоставить приблизительное местоположение вашему приложению, на этот раз диалог системы отличается, как показано на рисунке 4 и рисунке 5 :
Первоначально запросить только местоположение переднего плана
Даже если несколько функций в вашем приложении требуют доступа к местоположению, вполне вероятно, что только некоторые из них требуют доступа к фоновому местоположению. Таким образом, рекомендуется, чтобы ваше приложение выполнило дополнительные запросы на разрешения на местонахождение, запрашивая доступ к местоположению переднего плана, а затем доступ к месту фонового расположения. Выполняя инкрементные запросы, вы даете пользователям больше контроля и прозрачности, потому что они могут лучше понять, какие функции в вашем приложении нуждаются в доступе к месту местоположения.
На рисунке 6 показан пример приложения, предназначенное для обработки постепенных запросов. Как функции «Показать текущее местоположение», так и «Рекомендовать близлежащие места» требуют доступа к месту на переднем плане. Тем не менее, только функция «Рекомендовать близлежащие места» требует доступа к фоновому местоположению.
Процесс выполнения дополнительных запросов заключается в следующем:
Сначала ваше приложение должно направлять пользователей к функциям, которые требуют доступа к местоположению переднего плана, таких как функция «Расположение местоположения» на рисунке 1 или функция «Показать ток -местоположение» на рисунке 2.
Рекомендуется отключить пользовательский доступ к функциям, которые требуют доступа к фоновому расположению, пока ваше приложение не получит доступа к месту на переднем плане.
В более позднее время, когда пользователь исследует функциональность, которая требует доступа к фоновому местоположению, вы можете запросить доступ к месту фонового местоположения .
Запросить место на фоне при необходимости при необходимости
Содержание диалога разрешения зависит от целевой версии SDK
Когда функция в вашем приложении запрашивает местоположение фонового расположения на устройстве, которое запускает Android 10 (уровень 29 API 29), в диалоговом окне «Разрешения системы» включает в себя опцию « Разрешить все время» . Если пользователь выбирает эту опцию, функция в вашем приложении получает доступ к местоположению фона.
На Android 11 (API -уровне 30) и выше, однако, системный диалог не включает опцию «Разрешить все время» . Вместо этого пользователи должны включать местоположение фонового расположения на странице настроек, как показано на рисунке 7.
Вы можете помочь пользователям перейти на эту страницу настроек, следуя передовым методам при запросе разрешения на местоположение фонового местоположения. Процесс предоставления разрешения зависит от целевой версии SDK вашего приложения.
Приложения нацеливаются на Android 11 или выше
Если ваше приложение не было предоставлено разрешение ACCESS_BACKGROUND_LOCATION
, и shouldShowRequestPermissionRationale()
возвращается true
, покажите образовательный пользовательский интерфейс пользователям, который включает в себя следующее:
- Четкое объяснение того, почему функция вашего приложения требует доступа к фоновому расположению.
- Пользовательская метка опции «Настройки», которая предоставляет фоновое местоположение (например, разрешает все время на рисунке 7). Вы можете позвонить
getBackgroundPermissionOptionLabel()
чтобы получить этот ярлык. Возвращаемое значение этого метода локализуется в предпочтениях языка устройства пользователя. - Вариант для пользователей может отказаться от разрешения. Если пользователи отказываются от доступа на местоположении фонового расположения, они смогут продолжать использовать ваше приложение.
Приложения нацеливаются на Android 10 или ниже
Когда функция в вашем приложении запрашивает доступ фонового расположения, пользователи видят системный диалог. Этот диалог включает в себя возможность перейти к параметрам разрешения на местоположение вашего приложения на странице настроек.
Пока ваше приложение уже следует за лучшими практиками для запроса разрешений на местонахождение, вам не нужно вносить какие -либо изменения в поддержку такого поведения.
Пользователь может повлиять на точность местоположения фонового местоположения
Если пользователь запрашивает приблизительное местоположение , выбор пользователя в диалоговом окне «Разрешения на местоположение» также применяется к месту фона. Другими словами, если пользователь предоставляет ваше приложение разрешение ACCESS_BACKGROUND_LOCATION
, но предоставляет только приблизительный доступ к местоположению на переднем плане, ваше приложение также имеет только приблизительный доступ к местоположению в фоновом режиме.
Напоминание о гранте на фоновом расположении
На Android 10 и выше, когда функция в вашем приложении обращается к местоположению устройства в фоновом режиме в первый раз после того, как пользователь предоставляет доступ к месту места, система планирует уведомление для отправки пользователю. Это уведомление напоминает пользователю, что он позволил вашему приложению постоянно получать доступ к местоположению устройства. Пример уведомления появляется на рисунке 8.
Проверьте требования к местоположению в зависимости от SDK вашего приложения
Проверьте, использует ли ваше приложение какие -либо SDK, которые зависят от разрешений на местоположение, особенно разрешение ACCESS_FINE_LOCATION
. Проконсультируйтесь с этой статьей о том , чтобы узнать поведение ваших зависимостей SDK .
Дополнительные ресурсы
Для получения дополнительной информации о разрешениях на местоположение в Android, просмотрите следующие материалы:
Коделабс
Видео
Образцы
- Образец приложения для демонстрации использования разрешений на местоположение.
Чтобы защитить конфиденциальность пользователей, приложения, которые используют службы местоположения, должны запрашивать разрешения на местонахождение.
Когда вы запрашиваете разрешения на местонахождение, следуйте тем же лучшим практикам, что и для любого другого разрешения на время выполнения . Одно важное отличие, когда дело доходит до разрешений на местоположение, заключается в том, что система включает в себя несколько разрешений, связанных с местоположением. Какие разрешения вы запрашиваете, и как вы их запрашиваете, зависят от требований к местоположению для использования вашего приложения.
На этой странице описываются различные типы требований к местоположению и предоставляют руководство по запросу разрешений на местонахождение в каждом случае.
Типы доступа к местоположению
Каждое разрешение имеет комбинацию следующих характеристик:
- Категория : либо местоположение на переднем плане , либо место на фоне .
- Точность : либо точное местоположение, либо приблизительное местоположение.
Расположение переднего плана
Если ваше приложение содержит функцию, которая разделяет или получает информацию о местоположении только один раз или в течение определенного количества времени, то эта функция требует доступа к местоположению переднего плана. Некоторые примеры включают следующее:
- В приложении навигации функция позволяет пользователям получать направления по поводу поворота.
- В приложении обмена сообщениями функция позволяет пользователям делиться своим текущим местоположением с другим пользователем.
Система считает, что ваше приложение использует местоположение на переднем плане, если функция вашего приложения обращается к текущему местоположению устройства в одной из следующих ситуаций:
- Занятие, которое принадлежит вашему приложению, видно.
В вашем приложении запущена служба переднего плана. Когда работает служба переднего плана, система повышает осведомленность пользователя, показывая постоянное уведомление. Ваше приложение сохраняет доступ, когда оно помещается в фоновой речь, например, когда пользователь нажимает кнопку «Домой» на своем устройстве или выключает отображение их устройства.
Кроме того, рекомендуется объявить о
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
, вы можете попросить пользователя позволить вашему приложению доступ к точному местоположению .
Запрос на местоположение доступа во время выполнения
Когда функции в вашем приложении нуждается в доступе к местоположению, подождите, пока пользователь не взаимодействует с функцией, прежде чем сделать запрос на разрешение. Этот рабочий процесс следует за наилучшей практикой запроса разрешений во время выполнения в контексте, как описано в руководстве, которое объясняет, как запросить разрешения приложения .
На рисунке 1 показан пример того, как выполнить этот процесс. Приложение содержит функцию «Расположение местоположения», которая требует доступа к местоположению переднего плана. Однако приложение не запрашивает разрешение на местоположение, пока пользователь не выберет кнопку местоположения .
Пользователь может предоставить только приблизительное местоположение
На Android 12 (API -уровне 31) или выше пользователи могут запросить, чтобы ваше приложение извлекало только приблизительную информацию о местоположении, даже если ваше приложение запрашивает разрешение на выполнение ACCESS_FINE_LOCATION
.
Чтобы справиться с этим потенциальным поведением пользователя, не запрашивайте разрешение ACCESS_FINE_LOCATION
само по себе. Вместо этого запросите разрешение ACCESS_FINE_LOCATION
и разрешение ACCESS_COARSE_LOCATION
в одном запросе времени выполнения. Если вы попытаетесь запросить только ACCESS_FINE_LOCATION
, система игнорирует запрос в некоторых выпусках Android 12. Если ваше приложение нацелено на Android 12 или выше, система регистрирует следующее сообщение об ошибке в logCat :
ACCESS_FINE_LOCATION must be requested with ACCESS_COARSE_LOCATION.
Когда ваше приложение запрашивает как ACCESS_FINE_LOCATION
, так и ACCESS_COARSE_LOCATION
, диалоговое окно «Система разрешений» включает в себя следующие параметры для пользователя:
- Точно : позволяет вашему приложению получить точную информацию о местоположении.
- Приблизительно : позволяет вашему приложению получить только приблизительную информацию о местоположении.
На рисунке 3 показано, что диалог содержит визуальный сигнал для обоих параметров, чтобы помочь пользователю выбрать. После того, как пользователь решает о точности местоположения, он нажимает на одну из трех кнопок, чтобы выбрать продолжительность гранта разрешения.
На Android 12 и выше пользователи могут перейти к настройкам системы, чтобы установить предпочтительную точность местоположения для любого приложения, независимо от целевой версии SDK этого приложения. Это верно, даже когда ваше приложение установлено на устройстве, работающем Android 11 или ниже, а затем пользователь обновляет устройство до Android 12 или выше.
Выбор пользователя влияет на разрешение
В следующей таблице показаны разрешения, которые система предоставляет вашему приложению, на основе параметров, которые пользователь выбирает в диалоговом окне «Время выполнения разрешений»:
Точный | Приблизительный | |
---|---|---|
Во время использования приложения | ACCESS_FINE_LOCATION иACCESS_COARSE_LOCATION | ACCESS_COARSE_LOCATION |
Только на этот раз | ACCESS_FINE_LOCATION иACCESS_COARSE_LOCATION | ACCESS_COARSE_LOCATION |
Отрицать | Нет разрешений на местоположение | Нет разрешений на местоположение |
Чтобы определить, какие разрешения предоставили систему вашему приложению, проверьте возвращаемое значение вашего запроса на разрешения. Вы можете использовать библиотеки JetPack в коде, которые похожи на следующее, или вы можете использовать библиотеки платформ, где вы самостоятельно управляете кодом запроса разрешения .
Котлин
val locationPermissionRequest = registerForActivityResult( ActivityResultContracts.RequestMultiplePermissions() ) { permissions -> when { permissions.getOrDefault(Manifest.permission.ACCESS_FINE_LOCATION, false) -> { // Precise location access granted. } permissions.getOrDefault(Manifest.permission.ACCESS_COARSE_LOCATION, false) -> { // Only approximate location access granted. } else -> { // No location access granted. } } } // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(arrayOf( Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION))
Ява
ActivityResultLauncher<String[]> locationPermissionRequest = registerForActivityResult(new ActivityResultContracts .RequestMultiplePermissions(), result -> { Boolean fineLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_FINE_LOCATION, false); Boolean coarseLocationGranted = result.getOrDefault( Manifest.permission.ACCESS_COARSE_LOCATION,false); if (fineLocationGranted != null && fineLocationGranted) { // Precise location access granted. } else if (coarseLocationGranted != null && coarseLocationGranted) { // Only approximate location access granted. } else { // No location access granted. } } ); // ... // Before you perform the actual permission request, check whether your app // already has the permissions, and whether your app needs to show a permission // rationale dialog. For more details, see Request permissions. locationPermissionRequest.launch(new String[] { Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION });
Запросите обновление до точного местоположения
Вы можете попросить пользователя обновить доступ вашего приложения из приблизительного местоположения, чтобы точное местоположение. Однако, прежде чем попросить пользователя обновить доступ вашего приложения в точное местоположение, подумайте, требует ли вариант использования вашего приложения абсолютно этот уровень точности. Если вашему приложению необходимо сочетать устройство с близлежащими устройствами через Bluetooth или Wi-Fi, рассмотрите возможность использования сопряжения устройств-устройств или разрешений Bluetooth , вместо того, чтобы запрашивать разрешение ACCESS_FINE_LOCATION
.
Чтобы запросить, чтобы пользователь обновил доступ к местоположению вашего приложения с приблизительного, чтобы точно сделать следующее:
- При необходимости объясните, почему вашему приложению требуется разрешение .
- Запросите разрешения
ACCESS_FINE_LOCATION
иACCESS_COARSE_LOCATION
вместе. Поскольку пользователь уже позволил системе предоставить приблизительное местоположение вашему приложению, на этот раз диалог системы отличается, как показано на рисунке 4 и рисунке 5 :
Первоначально запросить только местоположение переднего плана
Даже если несколько функций в вашем приложении требуют доступа к местоположению, вполне вероятно, что только некоторые из них требуют доступа к фоновому местоположению. Таким образом, рекомендуется, чтобы ваше приложение выполнило дополнительные запросы на разрешения на местонахождение, запрашивая доступ к местоположению переднего плана, а затем доступ к месту фонового расположения. Выполняя инкрементные запросы, вы даете пользователям больше контроля и прозрачности, потому что они могут лучше понять, какие функции в вашем приложении нуждаются в доступе к месту местоположения.
На рисунке 6 показан пример приложения, предназначенное для обработки постепенных запросов. Как функции «Показать текущее местоположение», так и «Рекомендовать близлежащие места» требуют доступа к месту на переднем плане. Тем не менее, только функция «Рекомендовать близлежащие места» требует доступа к фоновому местоположению.
Процесс выполнения дополнительных запросов заключается в следующем:
Сначала ваше приложение должно направлять пользователей к функциям, которые требуют доступа к местоположению переднего плана, таких как функция «Расположение местоположения» на рисунке 1 или функция «Показать ток -местоположение» на рисунке 2.
Рекомендуется отключить пользовательский доступ к функциям, которые требуют доступа к фоновому расположению, пока ваше приложение не получит доступа к месту на переднем плане.
В более позднее время, когда пользователь исследует функциональность, которая требует доступа к фоновому местоположению, вы можете запросить доступ к месту фонового местоположения .
Запросить место на фоне при необходимости при необходимости
Содержание диалога разрешения зависит от целевой версии SDK
Когда функция в вашем приложении запрашивает местоположение фонового расположения на устройстве, которое запускает Android 10 (уровень 29 API 29), в диалоговом окне «Разрешения системы» включает в себя опцию « Разрешить все время» . Если пользователь выбирает эту опцию, функция в вашем приложении получает доступ к местоположению фона.
На Android 11 (API -уровне 30) и выше, однако, системный диалог не включает опцию «Разрешить все время» . Вместо этого пользователи должны включить местоположение фона на странице настроек, как показано на рисунке 7.
Вы можете помочь пользователям перейти на эту страницу настроек, следуя передовым методам при запросе разрешения на местоположение фонового местоположения. Процесс предоставления разрешения зависит от целевой версии SDK вашего приложения.
Приложения нацеливаются на Android 11 или выше
Если ваше приложение не было предоставлено разрешение ACCESS_BACKGROUND_LOCATION
, и shouldShowRequestPermissionRationale()
возвращается true
, покажите образовательный пользовательский интерфейс пользователям, который включает в себя следующее:
- Четкое объяснение того, почему функция вашего приложения требует доступа к фоновому расположению.
- Пользовательская метка опции «Настройки», которая предоставляет фоновое местоположение (например, разрешает все время на рисунке 7). Вы можете позвонить
getBackgroundPermissionOptionLabel()
чтобы получить этот ярлык. Возвращаемое значение этого метода локализуется в предпочтениях языка устройства пользователя. - Вариант для пользователей может отказаться от разрешения. Если пользователи отказываются от доступа на местоположении фонового расположения, они смогут продолжать использовать ваше приложение.
Приложения нацеливаются на Android 10 или ниже
Когда функция в вашем приложении запрашивает доступ фонового расположения, пользователи видят системный диалог. Этот диалог включает в себя возможность перейти к параметрам разрешения на местоположение вашего приложения на странице настроек.
Пока ваше приложение уже следует за лучшими практиками для запроса разрешений на местонахождение, вам не нужно вносить какие -либо изменения в поддержку такого поведения.
Пользователь может повлиять на точность местоположения фонового местоположения
Если пользователь запрашивает приблизительное местоположение , выбор пользователя в диалоговом окне «Разрешения на местоположение» также применяется к месту фона. Другими словами, если пользователь предоставляет ваше приложение разрешение ACCESS_BACKGROUND_LOCATION
, но предоставляет только приблизительный доступ к местоположению на переднем плане, ваше приложение также имеет только приблизительный доступ к местоположению в фоновом режиме.
Напоминание о гранте на фоновом расположении
On Android 10 and higher, when a feature in your app accesses device location in the background for the first time after the user grants background location access, the system schedules a notification to send to the user. This notification reminds the user that they've allowed your app to access device location all the time. An example notification appears in figure 8.
Check for location requirements in your app's SDK dependencies
Check whether your app uses any SDKs that depend on location permissions, especially the ACCESS_FINE_LOCATION
permission. Consult this article on Medium about Getting to know the behaviors of your SDK dependencies .
Дополнительные ресурсы
For more information about location permissions in Android, view the following materials:
Codelabs
Видео
Образцы
- Sample app to demonstrate the use of location permissions.