모다의 윈도우폰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: }