1 Haziran 2012 Cuma

GPS Kullanan Windows Phone Uygulaması Geliştirmek

Mobil cihazların piyasadaki yaygınlığını artırmasıyla birlikte GPS sensörü ve bu sensörü kullanan uygulamalar da hızla hayatımıza girdiler. GPS nedir diyorsanız, öncelikle buraya bir bakabilirsiniz. Kısaca, GPS sensörü fiziksel olarak bulunduğumuz noktanın enlem ve boylam olarak koordinatlarını bulmamıza yarar.

image

Windows Phone cihazların minimum donanım özellikleri arasında GPS sensörü de yer alıyor. Yani Windows Phone ile çalışmak üzere üretilmiş bir telefonun GPS barındırması şart. Windows Phone ve GPS sensörü deyince de akla hemen uygulamalar geliyor. GPS kullanan uygulamalar, genellikle bir harita uygulaması ile beraber karşımıza çıkmasına rağmen, bu bilgiyi kullanarak ne yapabileceğimiz tamamen bize kalmıştır. Burada iş hayal gücü ve yaratıcılığa bağlı. Kullanım alanlarına; arama kurtarma, yön bulma, harita üzerinde adres pinleme gibi örnekler verilebilir.

Bu kısa girişten sonra gelelim konumuza. Bu yazıda, Windows Phone içerisinde yer alan GPS sensörünün nasıl kullanılacağına değinerek, koordinat bilgisinin nasıl elde edildiğini inceleyeceğiz.

Öncelikle, Windows Phone içerisinde yer alan GPS sensörüne ulaşmak için kullanacağımız GeoCoordinateWatcher isimli sınıfa erişebilmek için, projemizin referanslarına System.Device.dll dosyasını eklememiz gerekiyor.

image

DLL’i referanslara ekledikten sonra da using bloklarımız arasına System.Device.Location isimalanını eklemeliyiz.

using System.Device.Location;

Dizayn tarafında da, elde edilecek enlem ve boylam bilgilerini görüntülemek için aşağıdaki gibi bir form tasarımı yapalım. Dört adet TextBox ve iki Button’dan oluşan sayfada verileri görüntüleyeceğimiz kontrollerin adları; txtEnlem ve txtBoylam.

image

Tasarımı tamamladıktan sonra kod sayfasına geçelim ve aşağıdaki satırı kullanarak GeoCoordinateWatcher tipinden bir field tanımlayalım.

GeoCoordinateWatcher gcw;

Bunun ardından, constructor’ın içerisine aşağıdaki kodları ekleyelim.

gcw = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
gcw.MovementThreshold = 10;
gcw.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(gcw_PositionChanged);

Burada, ilk satırda bütün süreçte bize yardımcı olacak olan GeoCoordinateWatcher nesnesi örnekleniyor. Nesne örneklenirken verilen GeoPositionAccuracy.High değeri, koordinatı tespit ederken GPS kullanmak istediğimizi bildiriyor. GeoPositionAccuracy.High yerine GeoPositionAccuracy.Default kullanarak bu bilginin GSM şebekesi üzerinden ya da IP üzerinden elde edilmesini de sağlayabilirdik. GeoCoordinateWatcher sınıfının default constructor’ını kullanarak da nesneyi örnekleyebilirdik. Bu durumda varsayılan hassasiyet derecesi olarak GeoPositionAccuracy.Default değeri kullanılacaktı ve yer tespiti sırasında GSM şebekesinden gelen bilgi ile işlem yapılacaktı.

NOT: GSM şebekesinden gelen bilgi, GPS üzerinden gelen bilgi kadar tutarlı değildir.

MovementThreshold ile tekrar değişiklik bildirimi yapmadan önce ne kadarlık bir mesafe değişikliğinin gerektiği bilgisini tanımlarız. Küçük değerler makinayı daha çok yorar ama hassasiyeti artıracaktır.

Üçüncü satırdaki tanımlama ile de PositionChanged olayı (event) her tetiklendiğinde yani koordinat bilgisi her değiştiğinde yapılmasını istediğimiz işlemi barındıran methodu gösteriyoruz. İhtiyacımız olan şey, bu bilgiler değiştikçe düzenli olarak txtEnlem ve txtBoylam isimli TextBlock’lar üzerinde güncel değerleri görüntülemek. Şimdi methodu yazalım ve içini kodlayalım.

void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
    txtEnlem.Text = e.Position.Location.Latitude.ToString();
    txtBoylam.Text = e.Position.Location.Longitude.ToString();
}

PositionChanged olayı her tetiklendiğinde yani lokasyon değişikliğinin bildirilmesi gerektiği durumlarda, gcw_PositionChanged isimli metodumuz bir çağrı alacak ve ihtiyaç duyulan bilgiler methodumuza parametre olarak gönderilecektir. Metot parametresi olan e değişkeni üzerinden bu bilgilere ulaşabiliriz.

NOT: Location özelliği üzerinde Latitude ve Longitude dışında bilgiler de yer alır.

Koordinat takibini başlatmak için kullanılacak butonun altına aşağıdaki kodu yazarak sürecin başlamasını sağlayabiliriz.

gcw.Start();

Süreci sonlandıracak butonun altında ise yine aşağıda yer alan kod kullanılabilir.

gcw.Stop();

Uygulama artık hazır durumda. İster telefonunuza atıp test edin, isterseniz emulatör üzerindeki Location bölümündeki haritadan faydalanarak bilgisayarınızda test edin.

Uygulama tamamlandığında XAML ve C# kodları aşağıdaki gibi olmalıdır.

XAML:

<phone:PhoneApplicationPage
    x:Class="GPS_Kullanimi.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" d:DesignWidth="480" d:DesignHeight="768"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel contains the name of the application and page title-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock x:Name="ApplicationTitle" Text="GPS Sensörü Kullanım Örneği" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock x:Name="PageTitle" Text="Test Sayfası" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel - place additional content here-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <TextBlock Height="30" HorizontalAlignment="Left" Margin="132,56,0,0" Name="textBlock1" Text="Enlem:" VerticalAlignment="Top" />
            <TextBlock Height="30" HorizontalAlignment="Left" Margin="121,92,0,0" Name="textBlock2" Text="Boylam:" VerticalAlignment="Top" />
            <TextBlock Height="30" HorizontalAlignment="Left" Margin="197,56,0,0" Name="txtEnlem" Text="TextBlock" VerticalAlignment="Top" />
            <TextBlock Height="30" HorizontalAlignment="Left" Margin="197,92,0,0" Name="txtBoylam" Text="TextBlock" VerticalAlignment="Top" />
            <Button Content="Başlat" Height="72" HorizontalAlignment="Left" Margin="56,159,0,0" Name="btnBaslat" VerticalAlignment="Top" Width="160" Click="btnBaslat_Click" />
            <Button Content="Durdur" Height="72" HorizontalAlignment="Left" Margin="222,159,0,0" Name="btnDurdur" VerticalAlignment="Top" Width="160" Click="btnDurdur_Click" />
        </Grid>
    </Grid>
</phone:PhoneApplicationPage>

C#:

using System;
using System.Windows;
using Microsoft.Phone.Controls;
//ns
using System.Device.Location;

namespace GPS_Kullanimi
{
    public partial class MainPage : PhoneApplicationPage
    {
        GeoCoordinateWatcher gcw;

        // Constructor
        public MainPage()
        {
            InitializeComponent();
            gcw = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
            gcw.MovementThreshold = 10;
            gcw.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(gcw_PositionChanged);
        }

        void gcw_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
        {
            txtEnlem.Text = e.Position.Location.Latitude.ToString();
            txtBoylam.Text = e.Position.Location.Longitude.ToString();
        }

        private void btnBaslat_Click(object sender, RoutedEventArgs e)
        {
            gcw.Start();
        }

        private void btnDurdur_Click(object sender, RoutedEventArgs e)
        {
            gcw.Stop();
        }
    }
}

Artık, uygulamayı çalıştırıp test edebilirsiniz. Ek olarak, Windows Phone Developer Blog içerisinde yer alan Windows Phone GPS Emulator başlıklı yazıya da bakmanızda fayda var.

Hiç yorum yok:

Yorum Gönder