【Windows Phone 8】取得目前地理位置
前言:
目前在做App時需要取得當前的位置,所以寫此篇文章,以下就開始實作。
實作:
在【專案總管】>【Properties】>【WMAppManifest.xml】開啟後將【ID_CAP_LOCATION】服務開啟
在頁面加入下列Xaml
<StackPanel>
      <TextBlock x:Name="LatitudeTextBlock"/>
      <TextBlock x:Name="LongitudeTextBlock"/>
      <TextBlock x:Name="StatusTextBlock"/>
</StackPanel> 需加入下列引用using Windows.Devices.Geolocation;
using System.IO.IsolatedStorage;
Step-1 加入全域變數
Geolocator geolocator = null;
bool tracking = false;  Step-2 加入位置狀態改變事件
void geolocator_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
        {
            
            string status = "";
            switch (args.Status)
            {
                case PositionStatus.Disabled:
                    status = "位置服務未開啟";
                    break;
                case PositionStatus.Initializing:
                    status = "初始化中";
                    break;
                case PositionStatus.NoData:
                    status = "無資料";
                    break;
                case PositionStatus.Ready:
                    status = "完成";
                    break;
                case PositionStatus.NotAvailable:
                    status = "不可使用";
                    break;
                case PositionStatus.NotInitialized:
                    break;
            }
            Dispatcher.BeginInvoke(() =>
            {
                StatusTextBlock.Text = status;
            });
        } Step-3 加入位置改變事件 void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
        {
            
            Dispatcher.BeginInvoke(() =>
            {
                LatitudeTextBlock.Text = args.Position.Coordinate.Latitude.ToString("0.000000");
                LongitudeTextBlock.Text = args.Position.Coordinate.Longitude.ToString("0.000000");
                LatLng(args.Position.Coordinate.Latitude.ToString("0.000000"), args.Position.Coordinate.Longitude.ToString("0.000000"));
            });
        }
Step-4 在導入至頁面時加入判斷是否允許存取位置服務
protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            if (IsolatedStorageSettings.ApplicationSettings.Contains("LocationConsent") && (bool)IsolatedStorageSettings.ApplicationSettings["LocationConsent"] == true)
            {
                // User has opted in or out of Location
                return;
            }
            else
            {
                MessageBoxResult result =
                    MessageBox.Show("此應用程式將存取你的位置?",
                    "存取通知",
                    MessageBoxButton.OKCancel);
                if (result == MessageBoxResult.OK)
                {
                    IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = true;
                }
                else
                {
                    IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = false;
                }
                IsolatedStorageSettings.ApplicationSettings.Save();
            }
        }
Step-5 啟動事件(以AppBarButton做觸發事件)
void appBarButton_Click(object sender, EventArgs e)
        {
            if ((bool)IsolatedStorageSettings.ApplicationSettings["LocationConsent"] != true)
            {
                // 當不允許位置服務將不回傳任何東西
                return;
            }
            if (!tracking)
            {
                geolocator = new Geolocator();
                geolocator.DesiredAccuracy = PositionAccuracy.Default;
                //定位精確度High較精確但效能較差,Default與前者相反。
                geolocator.MovementThreshold = 100; 
                // 當距離上一再取得之位置移動100公尺將會觸發PositionChanged事件
                geolocator.StatusChanged += geolocator_StatusChanged;
                geolocator.PositionChanged += geolocator_PositionChanged;
                tracking = true;
            }
        }
 Step-6 關閉事件(以AppBarButton做觸發事件)void appBarButtonstop_Click(object sender, EventArgs e)
        {
            if (tracking)
            {
                geolocator.PositionChanged -= geolocator_PositionChanged;
                geolocator.StatusChanged -= geolocator_StatusChanged;
                geolocator = null;
                tracking = false;
                StatusTextBlock.Text = "位置服務已關閉";
            }
        }
執行結果: 
