Если вашему приложению необходимо запрашивать местоположение или получать обновления разрешений, устройству необходимо включить соответствующие системные настройки, такие как сканирование GPS или Wi-Fi. Вместо того, чтобы напрямую включать такие службы, как GPS устройства, ваше приложение указывает требуемый уровень точности/потребления энергии и желаемый интервал обновления, а устройство автоматически вносит соответствующие изменения в системные настройки. Эти настройки определяются объектом данных LocationRequest
.
В этом уроке показано, как использовать клиент настроек для проверки включенных настроек и отображения диалогового окна «Настройки местоположения», чтобы пользователь мог обновить свои настройки одним нажатием.
Настройка служб определения местоположения
Чтобы использовать службы определения местоположения, предоставляемые сервисами Google Play и поставщиком объединенного местоположения, подключите свое приложение с помощью клиента настроек , затем проверьте текущие настройки местоположения и предложите пользователю включить требуемые настройки, если это необходимо.
Приложения, функции которых используют службы определения местоположения, должны запрашивать разрешения на определение местоположения в зависимости от вариантов использования этих функций.
Настройте запрос местоположения
Чтобы сохранить параметры для запросов к поставщику Fused Location, создайте LocationRequest
. Параметры определяют уровень точности для запросов местоположения. Подробную информацию обо всех доступных параметрах запроса местоположения см. в справочнике по классу LocationRequest
. В этом уроке задаются интервал обновления, самый быстрый интервал обновления и приоритет, как описано ниже:
- Интервал обновления
-
setIntervalMillis()
- Этот метод устанавливает частоту в миллисекундах, с которой ваше приложение предпочитает получать обновления местоположения. Обратите внимание, что обновления местоположения могут быть немного быстрее или медленнее этой частоты для оптимизации использования батареи, или обновлений может не быть вообще (например, если устройство не имеет подключения). - Самый быстрый интервал обновления
-
setMinUpdateIntervalMillis()
- Этот метод устанавливает самую высокую скорость в миллисекундах, с которой ваше приложение может обрабатывать обновления местоположения. Если только ваше приложение не получает выгоду от получения обновлений быстрее, чем указано вsetInterval()
, вам не нужно вызывать этот метод. - Приоритет
setPriority()
- Этот метод устанавливает приоритет запроса, что дает службам определения местоположения Google Play четкую подсказку о том, какие источники местоположения использовать. Поддерживаются следующие значения:-
PRIORITY_BALANCED_POWER_ACCURACY
— используйте этот параметр для запроса точности определения местоположения в пределах городского квартала, что составляет точность около 100 метров. Это считается грубым уровнем точности и, скорее всего, потребляет меньше энергии. При использовании этого параметра службы определения местоположения, скорее всего, будут использовать Wi-Fi и позиционирование вышек сотовой связи. Однако следует отметить, что выбор поставщика местоположения зависит от многих других факторов, например, от того, какие источники доступны. -
PRIORITY_HIGH_ACCURACY
— используйте эту настройку, чтобы запросить максимально точное местоположение. С этой настройкой службы определения местоположения с большей вероятностью будут использовать GPS для определения местоположения. -
PRIORITY_LOW_POWER
— используйте эту настройку для запроса точности на уровне города, которая составляет приблизительно 10 километров. Это считается грубым уровнем точности и, вероятно, потребляет меньше энергии. -
PRIORITY_PASSIVE
— используйте этот параметр, если вам нужно незначительное влияние на энергопотребление, но вы хотите получать обновления местоположения, когда они доступны. С этим параметром ваше приложение не запускает никаких обновлений местоположения, но получает местоположения, запускаемые другими приложениями.
-
Создайте запрос местоположения и задайте параметры, как показано в этом примере кода:
Котлин
fun createLocationRequest() { val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000) .setMinUpdateIntervalMillis(5000) .build() }
Ява
protected void createLocationRequest() { LocationRequest locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000) .setMinUpdateIntervalMillis(5000) .build(); }
Приоритет PRIORITY_HIGH_ACCURACY
в сочетании с настройкой разрешения ACCESS_FINE_LOCATION
, которую вы определили в манифесте приложения, и быстрым интервалом обновления в 5000 миллисекунд (5 секунд) заставляет поставщика fusion location возвращать обновления местоположения с точностью до нескольких футов. Этот подход подходит для картографических приложений, которые отображают местоположение в реальном времени.
Совет по производительности: если ваше приложение обращается к сети или выполняет другую длительную работу после получения обновления местоположения, измените самый быстрый интервал на более медленное значение. Эта настройка не позволит вашему приложению получать обновления, которые оно не может использовать. После завершения длительной работы снова установите самый быстрый интервал на быстрое значение.
Получить текущие настройки местоположения
После подключения к сервисам Google Play и API сервисов определения местоположения вы можете получить текущие настройки местоположения устройства пользователя. Для этого создайте LocationSettingsRequest.Builder
и добавьте один или несколько запросов местоположения. Следующий фрагмент кода показывает, как добавить запрос местоположения, созданный на предыдущем шаге:
Котлин
val builder = LocationSettingsRequest.Builder() .addLocationRequest(locationRequest)
Ява
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(locationRequest);
Далее проверьте, удовлетворены ли текущие настройки местоположения:
Котлин
val builder = LocationSettingsRequest.Builder() // ... val client: SettingsClient = LocationServices.getSettingsClient(this) val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())
Ява
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); // ... SettingsClient client = LocationServices.getSettingsClient(this); Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
Когда Task
завершится, ваше приложение может проверить настройки местоположения, посмотрев на код состояния из объекта LocationSettingsResponse
. Чтобы получить еще больше подробностей о текущем состоянии соответствующих настроек местоположения, ваше приложение может вызвать метод getLocationSettingsStates()
объекта LocationSettingsResponse
.
Предложить пользователю изменить настройки местоположения
Чтобы определить, соответствуют ли настройки местоположения запросу местоположения, добавьте OnFailureListener
к объекту Task
, который проверяет настройки местоположения. Затем проверьте, является ли объект Exception
, переданный методу onFailure()
, экземпляром класса ResolvableApiException
, что указывает на необходимость изменения настроек. Затем отобразите диалоговое окно, запрашивающее у пользователя разрешение на изменение настроек местоположения путем вызова startResolutionForResult()
.
В следующем фрагменте кода показано, как определить, позволяют ли настройки местоположения пользователя службам определения местоположения создавать LocationRequest
, а также как запросить у пользователя разрешение на изменение настроек местоположения при необходимости:
Котлин
task.addOnSuccessListener { locationSettingsResponse -> // All location settings are satisfied. The client can initialize // location requests here. // ... } task.addOnFailureListener { exception -> if (exception is ResolvableApiException){ // Location settings are not satisfied, but this can be fixed // by showing the user a dialog. try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). exception.startResolutionForResult(this@MainActivity, REQUEST_CHECK_SETTINGS) } catch (sendEx: IntentSender.SendIntentException) { // Ignore the error. } } }
Ява
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { // All location settings are satisfied. The client can initialize // location requests here. // ... } }); task.addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { if (e instanceof ResolvableApiException) { // Location settings are not satisfied, but this can be fixed // by showing the user a dialog. try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). ResolvableApiException resolvable = (ResolvableApiException) e; resolvable.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException sendEx) { // Ignore the error. } } } });
В следующем уроке «Запрос обновлений местоположения» будет показано, как получать периодические обновления местоположения.
, Если вашему приложению необходимо запрашивать местоположение или получать обновления разрешений, устройству необходимо включить соответствующие системные настройки, такие как сканирование GPS или Wi-Fi. Вместо того, чтобы напрямую включать такие службы, как GPS устройства, ваше приложение указывает требуемый уровень точности/потребления энергии и желаемый интервал обновления, а устройство автоматически вносит соответствующие изменения в системные настройки. Эти настройки определяются объектом данных LocationRequest
.
В этом уроке показано, как использовать клиент настроек для проверки включенных настроек и отображения диалогового окна «Настройки местоположения», чтобы пользователь мог обновить свои настройки одним нажатием.
Настройка служб определения местоположения
Чтобы использовать службы определения местоположения, предоставляемые сервисами Google Play и поставщиком объединенного местоположения, подключите свое приложение с помощью клиента настроек , затем проверьте текущие настройки местоположения и предложите пользователю включить требуемые настройки, если это необходимо.
Приложения, функции которых используют службы определения местоположения, должны запрашивать разрешения на определение местоположения в зависимости от вариантов использования этих функций.
Настройте запрос местоположения
Чтобы сохранить параметры для запросов к поставщику Fused Location, создайте LocationRequest
. Параметры определяют уровень точности для запросов местоположения. Подробную информацию обо всех доступных параметрах запроса местоположения см. в справочнике по классу LocationRequest
. В этом уроке задаются интервал обновления, самый быстрый интервал обновления и приоритет, как описано ниже:
- Интервал обновления
-
setIntervalMillis()
- Этот метод устанавливает частоту в миллисекундах, с которой ваше приложение предпочитает получать обновления местоположения. Обратите внимание, что обновления местоположения могут быть немного быстрее или медленнее этой частоты для оптимизации использования батареи, или обновлений может не быть вообще (например, если устройство не имеет подключения). - Самый быстрый интервал обновления
-
setMinUpdateIntervalMillis()
- Этот метод устанавливает самую высокую скорость в миллисекундах, с которой ваше приложение может обрабатывать обновления местоположения. Если только ваше приложение не получает выгоду от получения обновлений быстрее, чем указано вsetInterval()
, вам не нужно вызывать этот метод. - Приоритет
setPriority()
- Этот метод устанавливает приоритет запроса, что дает службам определения местоположения Google Play четкую подсказку о том, какие источники местоположения использовать. Поддерживаются следующие значения:-
PRIORITY_BALANCED_POWER_ACCURACY
— используйте этот параметр для запроса точности определения местоположения в пределах городского квартала, что составляет точность около 100 метров. Это считается грубым уровнем точности и, скорее всего, потребляет меньше энергии. При использовании этого параметра службы определения местоположения, скорее всего, будут использовать Wi-Fi и позиционирование вышек сотовой связи. Однако следует отметить, что выбор поставщика местоположения зависит от многих других факторов, например, от того, какие источники доступны. -
PRIORITY_HIGH_ACCURACY
— используйте эту настройку, чтобы запросить максимально точное местоположение. С этой настройкой службы определения местоположения с большей вероятностью будут использовать GPS для определения местоположения. -
PRIORITY_LOW_POWER
— используйте эту настройку для запроса точности на уровне города, которая составляет приблизительно 10 километров. Это считается грубым уровнем точности и, вероятно, потребляет меньше энергии. -
PRIORITY_PASSIVE
— используйте этот параметр, если вам нужно незначительное влияние на энергопотребление, но вы хотите получать обновления местоположения, когда они доступны. С этим параметром ваше приложение не запускает никаких обновлений местоположения, но получает местоположения, запускаемые другими приложениями.
-
Создайте запрос местоположения и задайте параметры, как показано в этом примере кода:
Котлин
fun createLocationRequest() { val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000) .setMinUpdateIntervalMillis(5000) .build() }
Ява
protected void createLocationRequest() { LocationRequest locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000) .setMinUpdateIntervalMillis(5000) .build(); }
Приоритет PRIORITY_HIGH_ACCURACY
в сочетании с настройкой разрешения ACCESS_FINE_LOCATION
, которую вы определили в манифесте приложения, и быстрым интервалом обновления в 5000 миллисекунд (5 секунд) заставляет поставщика fusion location возвращать обновления местоположения с точностью до нескольких футов. Этот подход подходит для картографических приложений, которые отображают местоположение в реальном времени.
Совет по производительности: если ваше приложение обращается к сети или выполняет другую длительную работу после получения обновления местоположения, измените самый быстрый интервал на более медленное значение. Эта настройка не позволит вашему приложению получать обновления, которые оно не может использовать. После завершения длительной работы снова установите самый быстрый интервал на быстрое значение.
Получить текущие настройки местоположения
После подключения к сервисам Google Play и API сервисов определения местоположения вы можете получить текущие настройки местоположения устройства пользователя. Для этого создайте LocationSettingsRequest.Builder
и добавьте один или несколько запросов местоположения. Следующий фрагмент кода показывает, как добавить запрос местоположения, созданный на предыдущем шаге:
Котлин
val builder = LocationSettingsRequest.Builder() .addLocationRequest(locationRequest)
Ява
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder() .addLocationRequest(locationRequest);
Далее проверьте, удовлетворены ли текущие настройки местоположения:
Котлин
val builder = LocationSettingsRequest.Builder() // ... val client: SettingsClient = LocationServices.getSettingsClient(this) val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())
Ява
LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); // ... SettingsClient client = LocationServices.getSettingsClient(this); Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());
Когда Task
завершится, ваше приложение может проверить настройки местоположения, посмотрев на код состояния из объекта LocationSettingsResponse
. Чтобы получить еще больше подробностей о текущем состоянии соответствующих настроек местоположения, ваше приложение может вызвать метод getLocationSettingsStates()
объекта LocationSettingsResponse
.
Предложить пользователю изменить настройки местоположения
Чтобы определить, соответствуют ли настройки местоположения запросу местоположения, добавьте OnFailureListener
к объекту Task
, который проверяет настройки местоположения. Затем проверьте, является ли объект Exception
, переданный методу onFailure()
, экземпляром класса ResolvableApiException
, что указывает на необходимость изменения настроек. Затем отобразите диалоговое окно, запрашивающее у пользователя разрешение на изменение настроек местоположения путем вызова startResolutionForResult()
.
В следующем фрагменте кода показано, как определить, позволяют ли настройки местоположения пользователя службам определения местоположения создавать LocationRequest
, а также как запросить у пользователя разрешение на изменение настроек местоположения при необходимости:
Котлин
task.addOnSuccessListener { locationSettingsResponse -> // All location settings are satisfied. The client can initialize // location requests here. // ... } task.addOnFailureListener { exception -> if (exception is ResolvableApiException){ // Location settings are not satisfied, but this can be fixed // by showing the user a dialog. try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). exception.startResolutionForResult(this@MainActivity, REQUEST_CHECK_SETTINGS) } catch (sendEx: IntentSender.SendIntentException) { // Ignore the error. } } }
Ява
task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { // All location settings are satisfied. The client can initialize // location requests here. // ... } }); task.addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { if (e instanceof ResolvableApiException) { // Location settings are not satisfied, but this can be fixed // by showing the user a dialog. try { // Show the dialog by calling startResolutionForResult(), // and check the result in onActivityResult(). ResolvableApiException resolvable = (ResolvableApiException) e; resolvable.startResolutionForResult(MainActivity.this, REQUEST_CHECK_SETTINGS); } catch (IntentSender.SendIntentException sendEx) { // Ignore the error. } } } });
В следующем уроке «Запрос обновлений местоположения» будет показано, как получать периодические обновления местоположения.