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

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

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

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

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

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

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

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

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

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

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

    Кроме того, рекомендуется объявить приоритетный тип службы 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 показан пример выполнения этого процесса. Приложение содержит функцию «поделиться местоположением», для которой требуется доступ к местоположению на переднем плане. Однако приложение не запрашивает разрешение на определение местоположения, пока пользователь не нажмет кнопку «Поделиться местоположением» .

После того, как пользователь нажмет кнопку «Поделиться местоположением», появится диалоговое окно разрешения местоположения в системе.
Рис. 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 или более поздней версии.

Диалог относится только к приблизительному местоположению и содержит 3 кнопки, расположенные одна над другой.
Рисунок 2. Диалоговое окно системных разрешений, которое появляется, когда ваше приложение запрашивает только ACCESS_COARSE_LOCATION .
В диалоговом окне есть два набора параметров, один над другим.
Рисунок 3. Диалоговое окно системных разрешений, которое появляется, когда ваше приложение запрашивает ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION в одном запросе во время выполнения.

Выбор пользователя влияет на предоставление разрешений

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

Точный Приблизительный
Во время использования приложения 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 .

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

  1. При необходимости объясните, почему вашему приложению требуется разрешение .
  2. Снова запросите разрешения ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION вместе. Поскольку пользователь уже разрешил системе предоставлять примерное местоположение вашему приложению, на этот раз системное диалоговое окно будет другим, как показано на рисунках 4 и 5 :
Диалоговое окно содержит параметры «Изменить точное местоположение», «Только в этот раз» и «Запретить».
Рис. 4. Пользователь ранее выбрал «Приблизительно» и «При использовании приложения» (в диалоговом окне на рис. 3 ).
Диалог содержит параметры «Только в этот раз» и «Запретить».
Рисунок 5. Пользователь ранее выбрал «Приблизительно» и «Только в этот раз» (в диалоге с рисунка 3 ).

Первоначально запрашивайте только местоположение на переднем плане

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

На рис. 6 показан пример приложения, предназначенного для обработки дополнительных запросов. Функции «показать текущее местоположение» и «рекомендовать ближайшие места» требуют доступа к местоположению на переднем плане. Однако только функция «рекомендовать ближайшие места» требует доступа к фоновому местоположению.

Кнопка, которая включает доступ к местоположению на переднем плане, расположена на половине длины экрана от кнопки, которая включает доступ к местоположению на заднем плане.
Рис. 6. Обе функции требуют доступа к местоположению, но только функция «рекомендовать близлежащие функции» требует доступа к фоновому местоположению.

Процесс выполнения дополнительных запросов выглядит следующим образом:

  1. Сначала ваше приложение должно направлять пользователей к функциям, требующим доступа к местоположению на переднем плане, таким как функция «поделиться местоположением» на рис. 1 или функция «показать текущее местоположение» на рис. 2.

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

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

При необходимости запросите фоновое местоположение.

Рисунок 7. Страница настроек включает опцию « Разрешить постоянно» , которая предоставляет фоновый доступ к местоположению.

Содержимое диалогового окна разрешений зависит от целевой версии SDK.

Когда функция вашего приложения запрашивает фоновое местоположение на устройстве под управлением Android 10 (уровень API 29), в диалоговом окне системных разрешений появляется параметр « Разрешить все время» . Если пользователь выберет этот вариант, функция вашего приложения получит фоновый доступ к местоположению.

Однако в Android 11 (уровень API 30) и более поздних версиях системное диалоговое окно не включает параметр «Разрешить постоянно» . Вместо этого пользователи должны включить фоновое расположение на странице настроек, как показано на рисунке 7.

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

Приложение предназначено для Android 11 или более поздней версии

Если вашему приложению не предоставлено разрешение ACCESS_BACKGROUND_LOCATION и shouldShowRequestPermissionRationale() возвращает true , покажите пользователям обучающий пользовательский интерфейс, который включает в себя следующее:

  • Четкое объяснение того, почему функции вашего приложения необходим доступ к фоновому местоположению.
  • Видимая пользователем метка параметра настроек, предоставляющая фоновое расположение (например, «Разрешить все время» на рис. 7). Вы можете вызвать getBackgroundPermissionOptionLabel() чтобы получить эту метку. Возвращаемое значение этого метода локализовано в соответствии с языковыми предпочтениями устройства пользователя.
  • Возможность для пользователей отклонить разрешение. Если пользователи откажутся от доступа к фоновому местоположению, они смогут продолжить использовать ваше приложение.
Пользователи могут нажать на системное уведомление, чтобы изменить настройки местоположения для приложения.
Рисунок 8. Уведомление, напоминающее пользователю, что он предоставил приложению доступ к фоновому местоположению.

Приложение предназначено для 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 показан пример выполнения этого процесса. Приложение содержит функцию «поделиться местоположением», для которой требуется доступ к местоположению на переднем плане. Однако приложение не запрашивает разрешение на определение местоположения, пока пользователь не нажмет кнопку «Поделиться местоположением» .

После того, как пользователь нажмет кнопку «Поделиться местоположением», появится диалоговое окно разрешения местоположения в системе.
Рис. 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 или более поздней версии.

Диалог относится только к приблизительному местоположению и содержит 3 кнопки, расположенные одна над другой.
Рисунок 2. Диалоговое окно системных разрешений, которое появляется, когда ваше приложение запрашивает только ACCESS_COARSE_LOCATION .
В диалоговом окне есть 2 набора опций, один над другим.
Рисунок 3. Диалоговое окно системных разрешений, которое появляется, когда ваше приложение запрашивает ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION в одном запросе во время выполнения.

Выбор пользователя влияет на предоставление разрешений

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

Точный Приблизительный
Во время использования приложения 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 .

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

  1. При необходимости объясните, почему вашему приложению требуется разрешение .
  2. Снова запросите разрешения ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION вместе. Поскольку пользователь уже разрешил системе предоставлять примерное местоположение вашему приложению, на этот раз системное диалоговое окно будет другим, как показано на рисунках 4 и 5 :
Диалоговое окно содержит параметры «Изменить точное местоположение», «Только в этот раз» и «Запретить».
Рис. 4. Пользователь ранее выбрал «Приблизительно» и «При использовании приложения» (в диалоговом окне на рис. 3 ).
Диалог содержит параметры «Только в этот раз» и «Запретить».
Рисунок 5. Ранее пользователь выбрал «Приблизительно» и «Только в этот раз » (в диалоге с рисунка 3 ).

Первоначально запрашивайте только местоположение на переднем плане

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

На рис. 6 показан пример приложения, предназначенного для обработки дополнительных запросов. Функции «показать текущее местоположение» и «рекомендовать ближайшие места» требуют доступа к местоположению на переднем плане. Однако только функция «рекомендовать ближайшие места» требует доступа к фоновому местоположению.

Кнопка, которая включает доступ к местоположению на переднем плане, расположена на половине длины экрана от кнопки, которая включает доступ к местоположению на заднем плане.
Рисунок 6. Обе функции требуют доступа к местоположению, но только функция «рекомендовать близлежащие функции» требует доступа к фоновому местоположению.

Процесс выполнения дополнительных запросов выглядит следующим образом:

  1. Сначала ваше приложение должно направлять пользователей к функциям, требующим доступа к местоположению на переднем плане, таким как функция «поделиться местоположением» на рис. 1 или функция «показать текущее местоположение» на рис. 2.

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

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

При необходимости запросите фоновое местоположение.

Рисунок 7. Страница настроек включает опцию « Разрешить постоянно» , которая предоставляет фоновый доступ к местоположению.

Содержимое диалогового окна разрешений зависит от целевой версии SDK.

Когда функция вашего приложения запрашивает фоновое местоположение на устройстве под управлением Android 10 (уровень API 29), в диалоговом окне системных разрешений появляется параметр « Разрешить все время» . Если пользователь выберет этот вариант, функция вашего приложения получит фоновый доступ к местоположению.

Однако в Android 11 (уровень API 30) и более поздних версиях системное диалоговое окно не включает параметр «Разрешить постоянно» . Вместо этого пользователи должны включить фоновое расположение на странице настроек, как показано на рисунке 7.

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

Приложение предназначено для Android 11 или более поздней версии

Если вашему приложению не предоставлено разрешение ACCESS_BACKGROUND_LOCATION и shouldShowRequestPermissionRationale() возвращает true , покажите пользователям обучающий пользовательский интерфейс, который включает в себя следующее:

  • Четкое объяснение того, почему функции вашего приложения необходим доступ к фоновому местоположению.
  • Видимая пользователем метка параметра настроек, предоставляющая фоновое расположение (например, «Разрешить все время» на рис. 7). Вы можете вызвать getBackgroundPermissionOptionLabel() чтобы получить эту метку. Возвращаемое значение этого метода локализовано в соответствии с языковыми предпочтениями устройства пользователя.
  • Возможность для пользователей отклонить разрешение. Если пользователи откажутся от фонового доступа к местоположению, они смогут продолжить использовать ваше приложение.
Пользователи могут нажать на системное уведомление, чтобы изменить настройки местоположения для приложения.
Рисунок 8. Уведомление, напоминающее пользователю, что он предоставил приложению доступ к фоновому местоположению.

Приложение предназначено для 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 показан пример того, как выполнить этот процесс. Приложение содержит функцию «Расположение местоположения», которая требует доступа к местоположению переднего плана. Однако приложение не запрашивает разрешение на местоположение, пока пользователь не выберет кнопку местоположения .

После того, как пользователь выбирает кнопку «Расположение общего расположения», появляется диалоговое окно разрешения на местонахождение системы
Рисунок 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 или выше.

Диалог относится только к приблизительному местоположению и содержит 3 кнопки, одна над другой
Рисунок 2. Диалоговое окно системных разрешений, которое появляется только при запрашивании вашего приложения ACCESS_COARSE_LOCATION .
Диалог имеет 2 набора параметров, один выше другого
Рисунок 3. Диалоговое окно системных разрешений, которое появляется, когда ваше приложение запрашивает как ACCESS_FINE_LOCATION , так и ACCESS_COARSE_LOCATION в одном запросе времени выполнения.

Выбор пользователя влияет на разрешение

В следующей таблице показаны разрешения, которые система предоставляет вашему приложению, на основе параметров, которые пользователь выбирает в диалоговом окне «Время выполнения разрешений»:

Точный Приблизительный
Во время использования приложения 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 .

Чтобы запросить, чтобы пользователь обновил доступ к местоположению вашего приложения с приблизительного, чтобы точно сделать следующее:

  1. При необходимости объясните, почему вашему приложению требуется разрешение .
  2. Запросите разрешения ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION вместе. Поскольку пользователь уже позволил системе предоставить приблизительное местоположение вашему приложению, на этот раз диалог системы отличается, как показано на рисунке 4 и рисунке 5 :
Диалог содержит параметры «Изменение на точное местоположение», «только на этот раз» и «отрицание».
Рисунок 4. Пользователь ранее выбрал приблизительный и при использовании приложения (в диалоговом окне на рисунке 3 ).
Диалог содержит параметры «только на этот раз» и «отрицание».
Рисунок 5. Пользователь ранее выбрал приблизительный и только на этот раз (в диалоговом окне на рисунке 3 ).

Первоначально запросить только местоположение переднего плана

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

На рисунке 6 показан пример приложения, предназначенное для обработки постепенных запросов. Как функции «Показать текущее местоположение», так и «Рекомендовать близлежащие места» требуют доступа к месту на переднем плане. Тем не менее, только функция «Рекомендовать близлежащие места» требует доступа к фоновому местоположению.

Кнопка, которая обеспечивает доступ к местоположению переднего плана, расположена на половину длины экрана от кнопки, которая обеспечивает местоположение фона
Рисунок 6. Обе функции требуют доступа к местоположению, но только функция «Рекомендовать близлежащие функции» требует доступа к фоновому расположению.

Процесс выполнения дополнительных запросов заключается в следующем:

  1. Сначала ваше приложение должно направлять пользователей к функциям, которые требуют доступа к местоположению переднего плана, таких как функция «Расположение местоположения» на рисунке 1 или функция «Показать ток -местоположение» на рисунке 2.

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

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

Запросить место на фоне при необходимости при необходимости

Рисунок 7. Страница «Настройки» включает в себя опцию под названием «Разрешить все время» , которая предоставляет доступ к месту места.

Содержание диалога разрешения зависит от целевой версии SDK

Когда функция в вашем приложении запрашивает местоположение фонового расположения на устройстве, которое запускает Android 10 (уровень 29 API 29), в диалоговом окне «Разрешения системы» включает в себя опцию « Разрешить все время» . Если пользователь выбирает эту опцию, функция в вашем приложении получает доступ к местоположению фона.

На Android 11 (API -уровне 30) и выше, однако, системный диалог не включает опцию «Разрешить все время» . Вместо этого пользователи должны включать местоположение фонового расположения на странице настроек, как показано на рисунке 7.

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

Приложения нацеливаются на Android 11 или выше

Если ваше приложение не было предоставлено разрешение ACCESS_BACKGROUND_LOCATION , и shouldShowRequestPermissionRationale() возвращается true , покажите образовательный пользовательский интерфейс пользователям, который включает в себя следующее:

  • Четкое объяснение того, почему функция вашего приложения требует доступа к фоновому расположению.
  • Пользовательская метка опции «Настройки», которая предоставляет фоновое местоположение (например, разрешает все время на рисунке 7). Вы можете позвонить getBackgroundPermissionOptionLabel() чтобы получить этот ярлык. Возвращаемое значение этого метода локализуется в предпочтениях языка устройства пользователя.
  • Вариант для пользователей может отказаться от разрешения. Если пользователи отказываются от доступа на местоположении фонового расположения, они смогут продолжать использовать ваше приложение.
Пользователи могут нажать на системное уведомление, чтобы изменить настройки местоположения для приложения
Рисунок 8. Уведомление, напоминающее пользователю о том, что он предоставил доступ к фоновому местоположению в приложение.

Приложения нацеливаются на 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 показан пример того, как выполнить этот процесс. Приложение содержит функцию «Расположение местоположения», которая требует доступа к местоположению переднего плана. Однако приложение не запрашивает разрешение на местоположение, пока пользователь не выберет кнопку местоположения .

После того, как пользователь выбирает кнопку «Расположение общего расположения», появляется диалоговое окно разрешения на местонахождение системы
Рисунок 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 или выше.

Диалог относится только к приблизительному местоположению и содержит 3 кнопки, одна над другой
Рисунок 2. Диалоговое окно системных разрешений, которое появляется только при запрашивании вашего приложения ACCESS_COARSE_LOCATION .
Диалог имеет 2 набора параметров, один выше другого
Рисунок 3. Диалоговое окно системных разрешений, которое появляется, когда ваше приложение запрашивает как ACCESS_FINE_LOCATION , так и ACCESS_COARSE_LOCATION в одном запросе времени выполнения.

Выбор пользователя влияет на разрешение

В следующей таблице показаны разрешения, которые система предоставляет вашему приложению, на основе параметров, которые пользователь выбирает в диалоговом окне «Время выполнения разрешений»:

Точный Приблизительный
Во время использования приложения 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 .

Чтобы запросить, чтобы пользователь обновил доступ к местоположению вашего приложения с приблизительного, чтобы точно сделать следующее:

  1. При необходимости объясните, почему вашему приложению требуется разрешение .
  2. Запросите разрешения ACCESS_FINE_LOCATION и ACCESS_COARSE_LOCATION вместе. Поскольку пользователь уже позволил системе предоставить приблизительное местоположение вашему приложению, на этот раз диалог системы отличается, как показано на рисунке 4 и рисунке 5 :
Диалог содержит параметры «Изменение на точное местоположение», «только на этот раз» и «отрицание».
Рисунок 4. Пользователь ранее выбрал приблизительный и при использовании приложения (в диалоговом окне на рисунке 3 ).
Диалог содержит параметры «только на этот раз» и «отрицание».
Рисунок 5. Пользователь ранее выбрал приблизительный и только на этот раз (в диалоговом окне на рисунке 3 ).

Первоначально запросить только местоположение переднего плана

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

На рисунке 6 показан пример приложения, предназначенное для обработки постепенных запросов. Как функции «Показать текущее местоположение», так и «Рекомендовать близлежащие места» требуют доступа к месту на переднем плане. Тем не менее, только функция «Рекомендовать близлежащие места» требует доступа к фоновому местоположению.

Кнопка, которая обеспечивает доступ к местоположению переднего плана, расположена на половину длины экрана от кнопки, которая обеспечивает местоположение фона
Рисунок 6. Обе функции требуют доступа к местоположению, но только функция «Рекомендовать близлежащие функции» требует доступа к фоновому расположению.

Процесс выполнения дополнительных запросов заключается в следующем:

  1. Сначала ваше приложение должно направлять пользователей к функциям, которые требуют доступа к местоположению переднего плана, таких как функция «Расположение местоположения» на рисунке 1 или функция «Показать ток -местоположение» на рисунке 2.

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

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

Запросить место на фоне при необходимости при необходимости

Рисунок 7. Страница «Настройки» включает в себя опцию под названием «Разрешить все время» , которая предоставляет доступ к месту места.

Содержание диалога разрешения зависит от целевой версии SDK

Когда функция в вашем приложении запрашивает местоположение фонового расположения на устройстве, которое запускает Android 10 (уровень 29 API 29), в диалоговом окне «Разрешения системы» включает в себя опцию « Разрешить все время» . Если пользователь выбирает эту опцию, функция в вашем приложении получает доступ к местоположению фона.

На Android 11 (API -уровне 30) и выше, однако, системный диалог не включает опцию «Разрешить все время» . Вместо этого пользователи должны включить местоположение фона на странице настроек, как показано на рисунке 7.

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

Приложения нацеливаются на Android 11 или выше

Если ваше приложение не было предоставлено разрешение ACCESS_BACKGROUND_LOCATION , и shouldShowRequestPermissionRationale() возвращается true , покажите образовательный пользовательский интерфейс пользователям, который включает в себя следующее:

  • Четкое объяснение того, почему функция вашего приложения требует доступа к фоновому расположению.
  • Пользовательская метка опции «Настройки», которая предоставляет фоновое местоположение (например, разрешает все время на рисунке 7). Вы можете позвонить getBackgroundPermissionOptionLabel() чтобы получить этот ярлык. Возвращаемое значение этого метода локализуется в предпочтениях языка устройства пользователя.
  • Вариант для пользователей может отказаться от разрешения. Если пользователи отказываются от доступа на местоположении фонового расположения, они смогут продолжать использовать ваше приложение.
Пользователи могут нажать на системное уведомление, чтобы изменить настройки местоположения для приложения
Рисунок 8. Уведомление, напоминающее пользователю о том, что он предоставил доступ к фоновому местоположению в приложение.

Приложения нацеливаются на 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.