Изменить настройки местоположения

Если вашему приложению необходимо запрашивать местоположение или получать обновления разрешений, на устройстве необходимо включить соответствующие системные настройки, такие как GPS или сканирование Wi-Fi. Вместо прямого включения таких служб, как GPS устройства, ваше приложение указывает требуемый уровень точности/потребления энергии и желаемый интервал обновления, а устройство автоматически вносит соответствующие изменения в настройки системы. Эти настройки определяются объектом данных LocationRequest .

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

Настройка служб определения местоположения

Чтобы использовать службы определения местоположения, предоставляемые Службами Google Play и поставщиком объединенного местоположения, подключите свое приложение с помощью клиента настроек , затем проверьте текущие настройки местоположения и предложите пользователю включить необходимые настройки, если это необходимо.

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

Настроить запрос местоположения

Чтобы сохранить параметры для запросов к объединенному поставщику местоположений, создайте LocationRequest . Параметры определяют уровень точности запросов местоположения. Подробные сведения обо всех доступных параметрах запроса местоположения см. в справочнике по классу LocationRequest . В этом уроке устанавливается интервал обновления, самый быстрый интервал обновления и приоритет, как описано ниже:

Интервал обновления
setInterval() — этот метод устанавливает частоту в миллисекундах, с которой ваше приложение предпочитает получать обновления местоположения. Обратите внимание, что обновления местоположения могут быть несколько быстрее или медленнее этой скорости, чтобы оптимизировать использование батареи, или обновления могут вообще не быть (например, если устройство не подключено к сети).
Самый быстрый интервал обновления
setFastestInterval() — этот метод устанавливает максимальную скорость в миллисекундах, с которой ваше приложение может обрабатывать обновления местоположения. Если ваше приложение не получает обновлений быстрее, чем скорость, указанная в setInterval() , вам не нужно вызывать этот метод.
Приоритет

setPriority() — этот метод устанавливает приоритет запроса, который дает службам определения местоположения Google Play четкую подсказку о том, какие источники местоположения использовать. Поддерживаются следующие значения:

  • PRIORITY_BALANCED_POWER_ACCURACY — используйте этот параметр, чтобы запросить точность определения местоположения в пределах городского квартала, что составляет примерно 100 метров. Это считается грубым уровнем точности и, вероятно, потребляет меньше энергии. При этой настройке службы определения местоположения, скорее всего, будут использовать определение местоположения по Wi-Fi и вышке сотовой связи. Однако обратите внимание, что выбор поставщика местоположения зависит от многих других факторов, например от доступных источников.
  • PRIORITY_HIGH_ACCURACY — используйте этот параметр, чтобы запросить максимально точное местоположение. При использовании этой настройки службы определения местоположения с большей вероятностью будут использовать GPS для определения местоположения.
  • PRIORITY_LOW_POWER — используйте этот параметр для запроса точности на уровне города, что составляет примерно 10 километров. Это считается грубым уровнем точности и, вероятно, потребляет меньше энергии.
  • PRIORITY_NO_POWER — используйте этот параметр, если вам нужно незначительное влияние на энергопотребление, но вы хотите получать обновления местоположения, когда они доступны. Благодаря этому параметру ваше приложение не запускает никаких обновлений местоположения, но получает данные о местоположениях, активируемые другими приложениями.

Создайте запрос местоположения и задайте параметры, как показано в этом примере кода:

Котлин

fun createLocationRequest() {
  val locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build()
}

Ява

protected void createLocationRequest() {
  LocationRequest locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build();
}

Приоритет PRIORITY_HIGH_ACCURACY в сочетании с настройкой разрешения ACCESS_FINE_LOCATION , определенной вами в манифесте приложения, и интервалом быстрого обновления в 5000 миллисекунд (5 секунд) заставляют поставщика объединенного местоположения возвращать обновления местоположения с точностью до нескольких секунд. ноги. Этот подход подходит для картографических приложений, которые отображают местоположение в режиме реального времени.

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

Получить текущие настройки местоположения

После подключения к сервисам 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.
            }
        }
    }
});

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