Partager via


모다의 윈도우폰7 뚝딱 팩토리(9)-위치기반 어플리케이션의 기초

 

한국마이크로소프트에서 초급 스마트폰 개발자 분들을 위해 공개하는 모다의 윈도우폰7 뚝딱 팩토리 아홉번째 영상!

 

스마트폰 어플리케이션에서 활용할 수 있는 강력한 기능중의 하나는 바로 자신의 위치를 활용할 수 있다는 것이죠. 현재 자신의 위치를 측정해서 맞춤형 서비스를 제공할 수 있습니다. 대표적인 기능이 바로 주변 맛집/관광지 찾기, 지도관련 어플리케이션 기능들이고, 지금도 많은 위치기반 어플리케이션들이 등록되고 있지요.

윈도우폰에서는 하드웨어 표준안의 제정으로 모든 윈도우폰에 A-GPS가 탑재되도록 하였습니다. 그리고 이것을 활용할 수 있는 API와 개발환경을 제공하고 있으며 이번 영상에서는 어떻게 GPS 모듈을 활용하여 지금의 위치를 측정할 수 있는지 알아봅니다.

특히 GPS를 활용함에 있어서, GPS 기능활용 자체 외에도 몇 가지 추가적으로 고려해야 할 사항들이 있는데요, 먼저 UI스레드/non-UI스래드간의 연동을 들 수 있습니다.  일반적으로 GPS모듈을 사용할 때 이벤트 핸들러/델리게이트를 사용하는 관계로 non-UI 스래드에서 사용하게 되는데요, Non-UI 스래드와 UI스래드간의 연동을 위해 Dispatcher.BeginInvoke()라는 메서드를 사용합니다.

또한 전력사용에 민감한 스마트폰의 특성항 배터리가 빨리 소모되는 문제를 해결하기 위해 항상 모듈의 작동/유후상태를 잘 컨트롤 해 주셔야 어플리케이션의 품질을 높일 수 있지요. 이러한 내용들을 영상에서 다루고 있으며, GPS 모듈을 사용할 때 고려해야 할 것들을 안내해 둔 문서가 MSDN에 있습니다.

 

위치를 측정하고 활용하는 것은 유용한 기능이긴 하지만 윈도우폰 SDK에서 제공되는 에뮬레이터에는 GPS를 테스트 할 수 있는 기능이 포함되어있지 않습니다. 따라서 위치기반 어플리케이션을 테스팅 하려면 개발자 등록이 되어있는  실제 디바이스를 사용하셔야 하는데요, 현재 우리나라에서는 개발자 등록이 가능하지 않습니다. 추후에 개발자 등록 사이트에 한국 개발자 등록이 오픈 될 예정이니 잠시만 기다려주세요! 이번 영상에서는 아쉬워하시는 분들의 갈증을 조금이라도 해소 해 드리고자, 실제 개발자 등록이 된 윈도우폰 위에서 테스트하는 장면도 보여드립니다.

 

    1:  using System;
    2:  using System.Collections.Generic;
    3:  using System.Linq;
    4:  using System.Net;
    5:  using System.Windows;
    6:  using System.Windows.Controls;
    7:  using System.Windows.Documents;
    8:  using System.Windows.Input;
    9:  using System.Windows.Media;
   10:  using System.Windows.Media.Animation;
   11:  using System.Windows.Shapes;
   12:  using Microsoft.Phone.Controls;
   13:   
   14:  using System.Device.Location;
   15:   
   16:  namespace LocationAware01
   17:  {
   18:      public partial class MainPage : PhoneApplicationPage
   19:      {
   20:          GeoCoordinateWatcher watcher;
   21:   
   22:          // Constructor
   23:          public MainPage()
   24:          {
   25:              InitializeComponent();
   26:   
   27:              // GPS init
   28:              watcher = new GeoCoordinateWatcher();
   29:              watcher.MovementThreshold = 20;
   30:              watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);
   31:          }
   32:   
   33:          void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
   34:          {
   35:              //throw new NotImplementedException();
   36:              // non-UI thread 에서 실행되므로 UI thread 와의 연동을 위해 Dispatcher를 사용
   37:              Deployment.Current.Dispatcher.BeginInvoke(() => MyPositionChanged(e));
   38:          }
   39:   
   40:          void MyPositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e)
   41:          {
   42:              // throw new NotImplementedException();
   43:              textBox1.Text = e.Position.Location.Latitude.ToString("0,000");
   44:              textBox2.Text = e.Position.Location.Longitude.ToString("0,000");
   45:   
   46:              watcher.Stop(); // for battery issue
   47:          }
   48:   
   49:          private void button1_Click(object sender, RoutedEventArgs e)
   50:          {
   51:              watcher.Start();
   52:          }
   53:      }
   54:  }