Северный (Арктический) федеральный университет им. М.В. Ломоносова
Опубликован: 10.04.2014 | Доступ: свободный | Студентов: 6824 / 1221 | Длительность: 14:18:00
Специальности: Программист
Самостоятельная работа 8:

Геолокационные возможности

< Самостоятельная работа 7 || Самостоятельная работа 8 || Лекция 6 >
Аннотация: Разработка приложения, демонстрирующего геолокационные возможности.

Цель лабораторной работы:

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

Задачи лабораторной работы:

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

13.1 Введение

В данной работе рассмотрим процесс создания приложения.

13.2 Разработка приложения, получающего координаты устройства и отслеживающего их изменение

Создадим приложение.

Далее будем править java файл, определяющий класс активности приложения. Внесем в этот класс следующие дополнения:

  • Нам потребуется экземпляр класса LocationManager, поэтому в методе onCreate() запишем следующую конструкцию:
    LocationManager mlocManager = 
      (LocationManager) getSystemService(Context.LOCATION_SERVICE);
          

    экземпляр класса LocationManager, как и большинство системных сервисов, создается с помощью вызова метода getSystemService().

  • Укажем, что в приложении необходимо получать обновления координат, сделаем это с помощью вызова метода requestLocationUpdates() класса LocationManager:
    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                  0, 0, mlocListener);
          
    первый параметр метода указывает способ получения координат, для этого используются константы класса LocationManager:
    GPS_PROVIDER - сообщает, что координаты определяются с помощью GPS;
    NETWORK_ PROVIDER - сообщает, что координаты определяются с использованием сигналов сотовых вышек и WiFi.

    В случае, когда необходимо получать координаты и с GPS, и от сотовых вышек необходимо вызвать метод requestLocationUpdates() дважды: один раз первый параметр должен быть равен GPS_PROVIDER, второй раз - NETWORK_ PROVIDER.

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

    Последний параметр указывает на слушателя, который получает вызовы при обновлениях координат. В нашем случае слушателем является переменная mlocListener - реализация интерфейса LocationListener.

  • Теперь необходимо объявить переменную mlocListener:
    LocationListener mlocListener = new LocationListener(){
      public void onLocationChanged(Location location) {      
        tvLat.append(" "+location.getLatitude());
        tvLon.append(" "+location.getLongitude());
      }
      public void onStatusChanged(String provider, int status, 
                    Bundle extras) {}
      public void onProviderEnabled(String provider) {}
      public void onProviderDisabled(String provider) {}      
    };
          

    Переменная mlocListener инициализируется реализацией интерфейса LocationListener. Этот интерфейс содержит 4 метода, каждый из которых должен быть определен в реализации интерфейса. Нас интересует метод onLocationChanged(), который вызывается каждый раз при изменении показаний GPS датчика, в этом методе всего лишь выполняется вывод полученных координат в информационные поля.

  • Чтобы разрешить получать обновления координат с помощью сигналов от сотовых вышек (NETWORK_PROVIDER) или с GPS датчика (GPS_PROVIDER), необходимо в файле манифеста добавить строку:
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
          

    (для работы с сигналами сотовых вышек) или

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
          

    (для работы GPS датчиком).

Без этих полномочий приложение "сломается" во время выполнения, когда попробует запросить обновление координат. Если в приложении в качестве источника координат используются и NETWORK_PROVIDER, и GPS_PROVIDER, в манифесте достаточно запросить только полномочия на ACESS_FINE_LOCATION. Тогда как ACCESS_COARSE_LOCATION позволяет работать только с NETWORK_PROVIDER.

В листинге 13.1 представлен код приложения, позволяющего получать координаты устройства и отслеживать их изменения, используя GPS приемник.

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

В Eclipse откройте компоновку (Perspective) DDMS, в этой компоновке выберите вкладку Emulator Control. С помощью инструмента DDMS, можно имитировать обновление данных о местоположении несколькими способами:

  • вручную передать значения широты и долготы на виртуальное устройство;
  • использовать GPX файл, описывающий маршрут для считывания эмулятором;
  • использовать KML файл, описывающий отдельные метки местности для последовательной передачи на виртуальное устройство.

13.3 Заключение

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

package com.example.lab5_4_geolocation;

import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.widget.TextView;

public class MainActivity extends Activity {
  
  TextView tvOut;
  TextView tvLon;
  TextView tvLat;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    tvOut = (TextView)findViewById(R.id.textView1);
    tvLon = (TextView)findViewById(R.id.longitude);
    tvLat = (TextView)findViewById(R.id.latitude);
    
    //Получаем сервис
    LocationManager mlocManager = (LocationManager) 
                  getSystemService(Context.LOCATION_SERVICE);
    
    LocationListener mlocListener = new LocationListener(){
      public void onLocationChanged(Location location) {
        
      //Called when a new location is found by the network location provider.
        tvLat.append(" "+location.getLatitude());
        tvLon.append(" "+location.getLongitude());
      }

      public void onStatusChanged(String provider, int status, Bundle extras) {}

      public void onProviderEnabled(String provider) {}

      public void onProviderDisabled(String provider) {}
        
    };
    
    //Подписываемся на изменения в показаниях датчика

    mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, 
                  mlocListener);
    
    //Если gps включен, то ... , иначе вывести "GPS is not turned on..."
    if (mlocManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
      tvOut.setText("GPS is turned on...");
      
    } else {
      tvOut.setText("GPS is not turned on...");
    }
  }
}
    
Листинг 13.1. Получение геолокационных данных
< Самостоятельная работа 7 || Самостоятельная работа 8 || Лекция 6 >
Марат Нуриджанян
Марат Нуриджанян

Пример: Скачать среду можно с сайта для разработчиков Android (http://developer.android.com/sdk/index.html).

Там скачать можно только Android Studio

Владимир Каункин
Владимир Каункин

В самостоятельной работе 2 в примере решения задания некорректно загадывается число (в двух местах), выбирая случайное целое число из диапазона [0, 99] вместо [1, 100], как того требует условие. Кроме того, загадывание числа всё таки лучше вынести в отдельный метод, как мне кажется.