31天學會Windows Phone 7開發:位置服務
本文是《Windows Phone 7開發31日談》系列的第十三篇文章。上一篇,我們討論了Windows Phone的震動控制器,以及如何告知我們的用戶去注意他們的設備上所發生的事兒。本文,我們談談位置服務,以及如何獲取他們的設備位置的信息。
為什么位置很重要?
設備在不斷發展,移動電話有了能為你提供比幾乎任何其他設備都高的定制信息的能力。特別是當我們說到電話的位置時。下面是一些具體的例子(我為本文整理的):
檢索文檔的程序
假設我們有一個應用程序(或者通過網絡訪問)包含了數以萬計的為客戶提供服務用的產品和設備的電路圖,零件表和文檔。在每一個設備上,都不得不去搜索當天是哪個用戶在使用,找到當前所處的具體辦公室或地點然后再從繁雜的文檔中去解析符合要求的。
通過在程序中添加位置信息,我們就完全不用去搜索用戶了。如果每個文檔都被標記了地理位置數據,當我們接近建筑物時,在那個地點的文檔立即被調出。 如果我們能夠獲取到一個大設施足夠的位置信息,甚至可以判斷出你最近的設備是哪個。通過設備的信息來決定具體要顯示的數據是通過位置數據增強程序功能的一種方式。
高爾夫程序
我見過很多高爾夫程序允許你輸入分數,記錄差點,甚至是和你的朋友分享這些數據。然而有一個想法突然從我腦海中浮現出來。
這個應用程序在開始時,識別你當前在哪個高爾夫球場。它也會列出附近的球場(你在途中的時候),不必去查找這個球場這是一個了不起的特性。另外,它 可以識別你在哪個洞,以及距離這個球場主要地標的距離(沙坑,水,樹,球穴區等等)。我見過的最酷的特性是桿桿分析。每次我打一桿,我告訴它是哪個。當我去球所在的地兒時,會記錄我打的這一桿走了多遠的距離,如果有足夠的數據,甚至可以基于我到球穴區之間的距離向我推薦如何打下一桿。這是位置數據的一個超贊的應用。
理解位置服務
我們有3種方法來獲取設備的位置。GPS,手機跟蹤定位和WiFi位置。下面來快速地瀏覽一下每種的優勢和弱點:
在你開始擔心得去比較和對照來自3種源的數據前,先看看圖片中的綠色云圖。微軟為我們提供了一組位置服務。
在Windows Phone 7中使用位置服務
寫到這兒,還沒有任何代碼。好消息來了:這可能是你在代碼中做的最簡單的事之一。按照下面的步驟:
1.創建一個GeoCoordinateWatcher對象。
2.創建一個事件處理程序處理用戶位置的改變。
3.在事件觸發時抓取數據。
你可能想為用戶提供更多功能(我的例子中正好做了這些事兒),但最簡單的例子是下面的代碼:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Animation;
- using System.Windows.Shapes;
- using Microsoft.Phone.Controls;
- using System.Device.Location;
- using Microsoft.Phone.Tasks;
- namespace Day13_LocationServices
- {
- public partial class MainPage : PhoneApplicationPage
- {
- GeoCoordinateWatcher gcw;
- // Constructor
- public MainPage()
- {
- InitializeComponent();
- gcw.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(gcw_PositionChanged);
- gcw.Start();
- }
- void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
- {
- Latitude.Text = e.Position.Location.Latitude.ToString();
- Longitude.Text = e.Position.Location.Longitude.ToString();
- }
- }
- }
像第11篇的加速感應器一樣,模擬器不能真正地獲取位置數據。(你可以檢查GoeCoordinateWatcher.Status來獲取信息)。然而,使用我們的好朋友Reactive Extensions,就可以模擬這些數據了。
MSDN上有一篇非常棒的關于如何實現的文章,所以我就不在這里重復了。你可以在這來查看MSDN中關于Windows Phone上Reactive Extensions和位置的使用。
下載代碼示例
在示例程序中,我盡可能多地利用了位置服務。我讓用戶在高和默認的精確度中來選擇,開始并停止服務,甚至在應用程序中創建當前坐標的地圖。來試試看。比上面任何例子都豐富。
原作者:Jeff Blankenburg 譯者:金山崟霸
中文來源:http://www.cnblogs.com/porscheyin/archive/2010/12/23/1914300.html
英文來源:http://www.jeffblankenburg.com/2010/10/13/31-days-of-windows-phone-day-13-location-services/
【編輯推薦】