Introduction
I was working on a really nice Windows phone 8 application that uses geolocation techniques to pinpoint the location of your friend. This will keep track of where they go and when. Isn’t it is a great idea to trace your girlfriend’s activity, her whole routine? In my point of view, it is awesome. This post is all about sharing the basic block of such application. To get the location co-ordinates latitude and longitude via GPS.
Using the Code
To start with, let’s create a Windows Phone 8 application project:
Name the project and click ok. Choose your desired Windows phone OS to work with. In our case, we are choosing OS version 8.0.
After selecting the OS version, Visual Studio might take some time to prepare your project. Once done, you will have a mainpage.xaml presented. We might not want to do anything on the mainpage’s XAML as of now. But we do want to write some code, so navigate to the mainpage.xaml.cs file. At the very beginning, mainpage.xaml.cs will have a lot of comments than code.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using GeolocationInWP8.Resources;
namespace GeolocationInWP8
{
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
}
}
}
I suggest you remove all the commented code as it’s not doing anything, rather creating confusion. So our mainpage code will dramatically shrink to:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using GeolocationInWP8.Resources;
namespace GeolocationInWP8
{
public partial class MainPage : PhoneApplicationPage
{
public MainPage()
{
InitializeComponent();
}
}
}
Ain’t that looking simple? Next is to initialize the GPS watcher:
private void GetCoordinate()
{
var watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High)
{
MovementThreshold = 1
};
watcher.PositionChanged += this.watcher_PositionChanged;
watcher.Start();
}
The above function will start the watcher and will create a position changed event which will always trigger when either of the GPS coordinate (Latitude or Longitude) would change.
private void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
var pos = e.Position.Location;
LatitudeVal.Text = pos.Latitude.ToString("0.000");
LongitudeVal.Text = pos.Longitude.ToString("0.000");
}
When the change in position occurs, we take the value of the Latitude and Longitude and push them all the way to the textblocks we will create in the mainpage.xaml. Let’s now move to our XAML of the mainpage
. We are going to do two things here. First is to create the Loaded
event of the mainpage
; this invokes when the mainpage
loads at the very beginning. Second is to create Textblock
s to display the values onto the screen.
<phone:PhoneApplicationPage
x:Class="Getting_GPS_coordinate.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:bm="using:Bing.Maps"
Loaded="MainPage_OnLoaded"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait" Orientation="Portrait"
shell:SystemTray.IsVisible="True">
-->
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"
Margin="12,0"/>
<TextBlock Text="GPS Watcher" Margin="9,-7,0,0"
Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBlock Text="Latitude: " Width="90" Height="30"
HorizontalAlignment="Left" VerticalAlignment="Top"/>
<TextBlock x:Name="LatitudeVal" Width="90" Height="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="101,0,0,0" />
<TextBlock Text="Longitude: " Width="90" Height="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="0,29,0,0"/>
<TextBlock x:Name="LongitudeVal" Width="90" Height="30"
HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="101,28,0,0" />
</Grid>
</Grid>
</phone:PhoneApplicationPage>
As you can see, in line #10 we have created mainpage
’s loaded
event. And from line #34 to line #44, we have created text blocks, to hold the values. Next, we move back to code, mainpage.xaml.cs and in the mailpageloaded
even that we have just created, call the GetCoordinate()
method that we created before.
private void MainPage_OnLoaded(object sender, RoutedEventArgs e)
{
GetCoordinate();
}
So in the end, here is how our mainpage.xaml.cs will look like:
using System;
using System.Collections.Generic;
using System.Device.Location;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Navigation;
using Microsoft.Maps.MapControl;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Shell;
using Getting_GPS_coordinate.Resources;
using MapLayer = Microsoft.Phone.Maps.Controls.MapLayer;
namespace Getting_GPS_coordinate
{
public partial class MainPage : PhoneApplicationPage
{
GeoCoordinateWatcher watcher;
public MainPage()
{
InitializeComponent();
}
private void GetCoordinate()
{
watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High)
{
MovementThreshold = 1
};
watcher.PositionChanged += this.watcher_PositionChanged;
watcher.StatusChanged += this.watcher_StatusChanged;
watcher.Start();
}
private void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
{
switch (e.Status)
{
case GeoPositionStatus.Disabled:
break;
case GeoPositionStatus.NoData:
break;
}
}
private void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
var epl = e.Position.Location;
LatitudeVal.Text = epl.Latitude.ToString("0.000");
LongitudeVal.Text = epl.Longitude.ToString("0.000");
}
private void MainPage_OnLoaded(object sender, RoutedEventArgs e)
{
GetCoordinate();
}
}
}
One more step to finish our application, we need to set permission. That is, we need to request Phone that “I want to use your GPS, allow me.” In order to do that, go to solution explorer and all the way to WMAppManifest.xml in properties.
Navigate to capabilities tab and check ID_CAP_LOCATION
.
That’s all we have to do. Save the project and run it.
Now in case you are using simulators like me to test the application, you can simulate the GPS. Just click on the “>>” in the simulator, choose location tab. Now you can simulate your position in the map, and the simulator will give you the GPS coordinates of the location you have selected.
You can download the sample project from here.
This is it for now. Stay tuned.
Happy reading!!!