Статьи

Android: локационные сервисы

Вступление

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

API местоположения

В предыдущих версиях Android SDK вам приходилось вручную реализовывать службу определения местоположения, которая абстрагирует основных поставщиков местоположения (на основе GPS или сотовой связи). Это не было идеальным, поскольку, как разработчик приложения, вы, вероятно, не беспокоитесь о деталях реализации получения местоположения пользователя.

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

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

Проверьте сервисы Google Play

Работа с API определения местоположения требует наличия приложения Google Play Services на устройстве. Рекомендуется проверять наличие сервисов Google play перед использованием API. Это можно сделать с помощью следующего кода:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
protected boolean testPlayServices() {
        int checkGooglePlayServices = GooglePlayServicesUtil.isGooglePlayServicesAvailable(getActivity());
        if (checkGooglePlayServices != ConnectionResult.SUCCESS) {
            // google play services is missing!!!!
            /*
             * Returns status code indicating whether there was an error.
             * Can be one of following in ConnectionResult: SUCCESS, SERVICE_MISSING,
             * SERVICE_VERSION_UPDATE_REQUIRED, SERVICE_DISABLED, SERVICE_INVALID.
             */
            GooglePlayServicesUtil.getErrorDialog(checkGooglePlayServices, getActivity(), 1122).show();
            return false;
        }
        return true;
    }

Кодовый листинг 1

Код листинга 1 показывает, как проверить наличие сервисов Google play. Если сервисы Google Play отсутствуют, отображается диалоговое окно, дающее пользователю возможность загрузить и установить приложение сервисов Google Play. Этот метод возвращает false, если сервисы не найдены, и его можно разместить вокруг любого кода, требующего сервисов Play.

Получение местоположения пользователей

Основным классом для использования Location API является LocationClient. Первое, что нужно сделать, — создать экземпляр LocationClient и передать требуемых слушателей. См. Следующий код, который обычно вызывается из onCreate из действия или onActivityCreated, если в фрагменте создается экземпляр LocationClient.

1
locationClient = new LocationClient(getActivity(), this, this);

Параметры:

  1. Контекст
  2. ConnectionCallbacks . Определяет методы onConnected () и onDisconnected ().
  3. OnConnectionFailedListener . Определяет метод onConnectionFailed ().

Когда создается экземпляр LocationClient, следующая вещь, которую нужно сделать, это вызвать метод connect () объекта LocationClient. Обычно это делается в методе onResume. В методе inPause вызывается метод connect () объекта LocationClient. Это гарантирует, что LocationClient активен только во время работы. Если вам требуется постоянное отслеживание местоположения пользователей, когда приложение находится в фоновом режиме, для этого лучше создать фоновый сервис.

Когда метод connect () успешен, вызывается обратный вызов onConnected (). В этом методе вы можете получить последнее известное местоположение пользователя, используя следующий метод:

1
locationClient.getLasLocation();

Периодические обновления местоположения

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

01
02
03
04
05
06
07
08
09
10
private static LocationRequest createLocationRequest() {
        final LocationRequest locationRequest = new LocationRequest();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        // The rate at which the application actively requests location updates.
        locationRequest.setInterval(60 * MILLISECONDS_IN_SECOND);
        // The fastest rate at which the application receives location updates, for example when another
        // application has requested a location update, this application also receives that event.
        locationRequest.setFastestInterval(10 * MILLISECONDS_IN_SECOND);
        return locationRequest;
    }

После создания LocationRequest и успешного завершения метода connect () объекта LocationClient вызывается метод onConnected. В этом методе LocationClient инструктируется отправлять периодические обновления местоположения приложению, используя следующий код:

1
locationClient.requestLocationUpdates(locationRequest, this);

Параметры:

  • locationRequest. Определяет качество обслуживания обновлений местоположения.
  • LocationListener. Определяет несколько методов обратного вызова, включая onLocationChanged, который вызывается, когда доступно новое местоположение.

Обязательные зависимости

Чтобы использовать сервисы Google Play в своем приложении, вы должны определить правильные зависимости в build.gradle. Существует две версии API: одна для Android 2.3. и выше и один для Android 2.2.

Используйте менеджер SDK для установки необходимых пакетов. Для Android 2.3 это:

  • Сервисы Google Play
  • Google репозиторий

Для Android 2.2 это:

  • Сервисы Google Play для Froyo
  • Google репозиторий

Поэтому, если ваши приложения ориентированы на Android 2.2, вы должны использовать сервисы Google Play для библиотеки Froyo. В вашем build.gradle укажите следующую зависимость:

Для Android 2.3:

1
2
3
dependencies {
    compile 'com.google.android.gms:play-services:4.0.30'
}

Для Android 2.2:

1
2
3
dependencies {
    compile 'com.google.android.gms:play-services:3.2.65'
}

Тестирование с фиктивными локациями

Для проверки с фиктивными местоположениями вы должны сделать следующее:

  1. Включить макеты мест в настройках разработчика.
  2. Загрузите пример приложения-примера LocationProvider: http://developer.android.com/training/location/location-testing.html
  3. Измените класс LocationUtils массивом местоположений, с которыми вы хотите протестировать.
  4. Установите пример приложения LocationProvider на свое устройство.
  5. Запустите пример приложения LocationProvider.
  6. Запустите приложение, для которого вы хотите проверить функциональность местоположения.

Удобный веб-сайт для определения широты и долготы адреса в целях тестирования: http://www.itouchmap.com/latlong.html

Вывод

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