Windows Phone 7 開發 31 日談——第13日:位置服務

l_serein發表於2012-11-02

By Jeff Blankenburg

本文是Windows Phone 7 開發 31 日談” 系列的第13日。

昨天,我們討論了Windows Phone的震動控制器,以及如何告知我們的使用者去注意他們的裝置上所發生的事兒。今天,我們談談位置服務,以及如何獲取他們的裝置位置的資訊。

為什麼位置很重要?

裝置在不斷髮展,行動電話有了能為你提供比幾乎任何其他裝置都高的定製資訊的能力。特別是當我們說到電話的位置時。下面是一些具體的例子(我為本文整理的):

檢索文件的程式

假設我們有一個應用程式(或者通過網路訪問)包含了數以萬計的為客戶提供服務用的產品和裝置的電路圖,零件表和文件。在每一個裝置上,都不得不去搜尋當天是哪個使用者在使用,找到當前所處的具體辦公室或地點然後再從繁雜的文件中去解析符合要求的。

通過在程式中新增位置資訊,我們就完全不用去搜尋使用者了。如果每個文件都被標記了地理位置資料,當我們接近建築物時,在那個地點的文件立即被調出。如果我們能夠獲取到一個大設施足夠的位置資訊,甚至可以判斷出你最近的裝置是哪個。通過裝置的資訊來決定具體要顯示的資料是通過位置資料增強程式功能的一種方式。

高爾夫程式

我見過很多高爾夫程式允許你輸入分數,記錄差點,甚至是和你的朋友分享這些資料。然而有一個想法突然從我腦海中浮現出來。

這個應用程式在開始時,識別你當前在哪個高爾夫球場。它也會列出附近的球場(你在途中的時候),不必去查詢這個球場這是一個了不起的特性。另外,它可以識別你在哪個洞,以及距離這個球場主要地標的距離(沙坑,水,樹,球穴區等等)。我見過的最酷的特性是杆杆分析。每次我打一杆,我告訴它是哪個。當我去球所在的地兒時,會記錄我打的這一杆走了多遠的距離,如果有足夠的資料,甚至可以基於我到球穴區之間的距離向我推薦如何打下一杆。這是位置資料的一個超讚的應用。

理解位置服務

我們有3種方法來獲取裝置的位置。GPS,手機跟蹤定位和WiFi位置。下面來快速地瀏覽一下每種的優勢和弱點:

clip_image001

在你開始擔心得去比較和對照來自3種源的資料前,先看看圖片中的綠色雲圖。微軟為我們提供了一組位置服務。

在Windows Phone 7中使用位置服務

寫到這兒,還沒有任何程式碼。好訊息來了:這可能是你在程式碼中做的最簡單的事之一。按照下面的步驟:

  1. 建立一個GeoCoordinateWatcher物件。
  2. 建立一個事件處理程式處理使用者位置的改變。
  3. 在事件觸發時抓取資料。

你可能想為使用者提供更多功能(我的例子中正好做了這些事兒),但最簡單的例子是下面的程式碼:

[c-sharp] view plaincopy
  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. using System.Device.Location;  
  14. using Microsoft.Phone.Tasks;  
  15. namespace Day13_LocationServices  
  16. {  
  17.     public partial class MainPage : PhoneApplicationPage  
  18.     {  
  19.         GeoCoordinateWatcher gcw;  
  20.         // Constructor  
  21.         public MainPage()  
  22.         {  
  23.              InitializeComponent();  
  24.              gcw.PositionChanged += new EventHandler>(gcw_PositionChanged);  
  25.              gcw.Start();  
  26.         }  
  27.         void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs e)  
  28.         {  
  29.             Latitude.Text = e.Position.Location.Latitude.ToString();  
  30.             Longitude.Text = e.Position.Location.Longitude.ToString();  
  31.         }  
  32.     }  
  33. }  

像第11日的加速感應器一樣,模擬器不能真正地獲取位置資料。(你可以檢查GoeCoordinateWatcher.Status來獲取資訊)。然而,使用我們的好朋友Reactive Extensions,就可以模擬這些資料了。

MSDN上有一篇非常棒的關於如何實現的文章,所以我就不在這裡重複了。你可以在這來檢視MSDN中關於Windows Phone上Reactive Extensions和 位置的使用。

下載程式碼示例

在示例程式中,我儘可能多地利用了位置服務。我讓使用者在高和預設的精確度中來選擇,開始並停止服務,甚至在應用程式中建立當前座標的地圖。來試試看。比上面任何例子都豐富。

clip_image002

原文地址:http://www.jeffblankenburg.com/post/31-Days-of-Windows-Phone-7c-Day-13-Location-Services.aspx

相關文章