GPS и как его обмануть в режиме отладки

Posted on Март 8, 2011

3


Во всех Windows Phone устройства есть встроенная система глобального позиционирования (GPS). GPS используется многими приложениями, такими как Карты, Камера и поиск (для предоставления результатов, которые зависят от места поиска). Разработчики могут использовать данные с GPS, используя пространство имен System.Device.Location, которое поддерживается в .NET версии 4 и выше. Класс GeoCoordinateWatcher представляет нам местоположение, основанное на координатах Долготы и Широты. Работа с GeoCoordinateWatcher относительно простая. Немного дальше мы обсудим, как с ним работать и как тестировать ваши приложения на Windows Phone 7. Но в вашем приложении, не всему е необходимо статическое положение на карте? Иногда необходимо и отслеживать передвижение, что бы определить поведение приложения в зависимости от положения.

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

Но не переживайте, как всегда, о нас позаботились. Windows Phone GPS Emulator (небольшое WPF приложение) и одна библиотека для WP7 позволят вам отлаживать приложение на эмуляторе или реальном устройстве, не покидая рабочего места. А как только вы завершите этап отладки и тестирования, вам будет необходимо всего лишь изменить одну строку кода для того, что бы получать реальные данные.

С помощью GPS Emulator вы можете установить свое местоположение где угодно на Земном шаре 🙂 А теперь добавьте к этому возможность добавления маршрутов и удобный интерфейс… Ну и конечно же эмуляция движения по маршруту!  Что входит:

  • Приложение GPS Emulator для Windows (WPF)
  • Клиентская библиотека для Windows Phone 7
  • Пример приложения для Windows Phone
  • Большое приложение, которое использует карты Bing (сложный пример)

Используя GPS Emulator вы можете создавать сложные маршруты, по которым вы потом будете «ехать» или «идти».  Телефон получит координаты, даже не подозревая, что его обманули 🙂

Использование GPS Emulator в вашем Windows Phone приложении

Когда я решился все же добавить GPS в свое приложение, я добавил Эмулятор. И долго не мог понять, почему же не работает на девайсе? Все потому, что я удалил лишние Capabilities из WMAppManifest. Удостоверьтесь, что в нем есть

<Capability Name=»ID_CAP_LOCATION»/>  <Capability Name=»ID_CAP_SENSORS»/>

Теперь давайте разберемся, как же GPS Emulator помогает вам отладить ваше приложение?

После того как вы загрузите Windows Phone GPS Emulator, в проекте вы найдете сборку которая называется GPSEmulatorClient. В этой библиотеке есть класс, который называется GeoCoordinateWatcher, собственно, так же называется, как и класс System.Device.Location.GeoCoordinateWatcher, просто они лежат в разных пространствах имен. Поддельный класс GeoCoordinateWatcher реализует интерфейс IGeoPositionWatcher, который реализует и настоящий класс. Потому, можно сказать что GPSEmulatorClient.GeoCoorinateWatcher реализует тоже API, что и настоящий System.Device.Location.GeoCoordinateWatcher. Что получается в итоге? Мы можем работать с поддельным классом вместо настоящего, всего лишь выполнив несколько простых условий: необходимо добавить ссылку на сборку GpsEmulatorClient и написать using GpsEmulatorClient; в своем классе.

Теперь сделаем так, что бы вы работали с GpsEmulator’ом в режиме отладки. Для этого необходимо установить галочку в свойствах проекта в режиме отладки #define DEBUG. Только не ставьте ее в свойствах релиза!

Теперь код использования:


IGeoPositionWatcher _Watcher;
 #if DEBUG
 _Watcher = new GpsEmulatorClient.GeoCoordinateWatcher();
 #else
 _Watcher = new System.Device.Location.GeoCoordinateWatcher();
 #endif

Просто, правда?

Так как _Watcher определен как IGeoPositionWatcher обе реализации, настоящая и нет, могут быть приведены к этому типу. С этого момента использования GeoCoordinateWatcher продолжается, как будто ничего не изменилось 🙂

Работаем с GeoCoordinateWatcher

Как сказано ранее, GeoCoordinateWatcher является частью пространства имен System.Device.Location. GeoCoordinateWatcher имеет следующие свойства:

  • DesiredAccurecy (тип GpsPositionAccurecy), Который может выставляться в High или оставаться по умолчанию. High означает, что положение будет более точным. Заметьте что это свойство может быстро скушать батарею.
  • Permission (тип GeoPositionPermission) определяют уровень доступа приложения к устройству. Не забываем устанавливать использование GPS в манифесте.
  • Position (тип GeoCoordinate) содержит данные о местоположении.
  • Status (тип GpsPositionStatus) показывает статус GPS.

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

Теперь подписываемся на события:

  • PositionChanged случается когда location service определяет изменение местоположения с учетом MovementThreshold.
  • StatusChanged случается когда статус сервиса местоположения изменяется, например с Initializing на Ready.

Немного о PositionChanged. После того как вы подписались на событие, и создали метод, то в нем, получить значение местоположения очень просто. необходимо всего лишь обратиться к  GeoPositionChangedEventArgs в которых есть e.Position.Location, содержащий Долготу, Широту, время и еще некоторые данные.

Перед тем как писать свое приложение, попробуйте тестовый пример. После него станет все понятно. Если вы хотите работать с эмулятором, убедитесь что WPF приложение запускается раньше чем вызывается метод который запускает location service. Так же следует иметь ввиду, что WPF приложение следует запускать от имени администратора, так как оно создет WCF канал для общения с приложением на эмуляторе или устройстве. Не забудьте поставить RELEASE когда будете тестировать приложение на реальных данных. Ну, или убрать свой define, если вы работали не через #define DEBUG.

Удачи с разработкой классных приложений с GPS.

Реклама