Windows 8 Metro'da GPS ve Geolocation API Kullanımı

0 dakikada yazıldı

35123 defa okundu

Düzenle

Bu makalemizde Windows 8 içerisinde WinRT (Windows Runtime)'daki
Geolocation (GPS) API'lerine yani kullanıcının konumunu bulma konusuna
değineceğiz. Geolocation API'lerinin kullanımı kolay olsa da diğer
API'lere kıyasla biraz daha detaylı denilebilir. Örneğimize başmadan
önce yeni bir Windows 8 Metro Uygulaması yaratıp ekrana da üç adet
TextBlock koyacağız. Bu TextBlockları enlem, boylam ve doğruluk
(elimizdeki GPS pozisyonu ne kadar hatalı) bilgilerini gösterecek.
Özellikle üçüncü değer olan doğruluk (Accuracy) konusuna biraz değinmek
istiyorum. WinRT'nin Geolocation API'leri kullanıcının konumunu bulmak
için farklı kaynaklar kullanabiliyor. Bunlar arasında kullanıcının
bilgisayarının internete nereden bağlı olduğu bilgisi de dahil. O
nedenle aslında cihazın GPS uydularına ulaşamayacağı senaryolarda da
kabaca kullanıcının hangi şehirde olduğu gibi bilgileri
edinebiliyorsunuz. Fakat bu durumda maalesef ki aldığınız koordinat
birer bir doğru bir koordinat olmuyor. İşte bu doğruluk miktarını bize
Accuracy olarak WinRT API'leri sağlıyor.

[XAML]

<Grid x:Name="LayoutRoot" Background="#FF0C0C0C">
    <StackPanel>
        <TextBlock x:Name="txtEnlem" />
        <TextBlock x:Name="txtBoylam" />
        <TextBlock x:Name="txtDogruluk" />
    </StackPanel>
</Grid>

Arayüz tarafımız bu kadar sade :) Amacımız ne de olsa API'leri incelemek
o nedenle hızlıca API tarafına geçelim.

[C#]

        Windows.UI.Core.CoreDispatcher DS;

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            DS = Window.Current.CoreWindow.Dispatcher;
            Geolocator geolocator = new Windows.Devices.Geolocation.Geolocator();
            geolocator.PositionChanged += new 
                           
TypedEventHandler
<Windows.Devices.Geolocation.Geolocator
            Windows.Devices.Geolocation.PositionChangedEventArgs>(geolocator_PositionChanged);

            geolocator.GetGeopositionAsync();
        }

İşte yukarıdaki kod aslında herşeyi yapıyor. Hemen satır satır
inceleyelim isterseniz. En üstte CoreDispatcher tipinde bir
değişkenimiz var. Bu değişkene ilk değeri kodumuzda Current
Windows üzerindn alıyoruz. Bu Dispatcher bize yeri geldiğinde
UIThread'e dönmek için bir yol sağlayacak. Sonrasında hemen
Geolocator nesnesimizi Geolocation namespace'i altından
alıyoruz. Aldığımız nesnenin PositionChanged event'ini dinlemeye
başladığımız anda artık GPS konumundaki değişiklikleri dinliyoruz
demektir. Tabi değişiklik olmaz ise event çalışmayacak ve hiç bilgi
alamayacağız. Uygulama ilk açıldığında hemen bilgi alabilmek adına
GetGeopositionAsync metodu ile ilk datanın gelmesini tetikliyoruz.

[C#]

        void geolocator_PositionChanged(Windows.Devices.Geolocation.Geolocator sender, 
                           
Windows.Devices.Geolocation.PositionChangedEventArgs args)
        {\

            DS.InvokeAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, (s, a) =>
            {
                Geoposition poz = (a.Context as IPositionChangedEventArgs).Position;

                txtEnlem.Text = "Enlem: " + poz.Coordinate.Latitude.ToString();
                txtBoylam.Text = "Boylam: " + poz.Coordinate.Longitude.ToString();
                txtDogruluk.Text = "Dogruluk: " + poz.Coordinate.Accuracy.ToString();
            }, this, args);
        }

PositionChanged içerisind hemen ilk olarak UIThread'e çıkmak için
daha önce kenara koyduğumuz Dispatcher üzerinden InvokeAsync'i
çağırıyoruz. Gelen argüman üzerinden Position'a ulaşıp oradan da
Coordinate üzerinden tüm istediğimiz bilgileri alabiliyoruz.

Eğer bu noktada uygulamanızı çalıştırırsanız hiçbirşey olmadığını
göreceksiniz :) Bu şekild özel donanımlar ve servisler kullandığımız
durumda uygulamamız ilk açıldığında WinRT'yi durumdan haberdar etmemiz
gerekiyor. Özetle uygulamamızın Geolocation kullanacağını AppManifest'te
belirtmemiz gerekirdi.

Location bilgisi kullanacağımızı AppManifest'te belirtmemiz gerek.
Location bilgisi kullanacağımızı AppManifest'te belirtmemiz gerek.

Solution Explorer içerisinde Package.appxmanifest dosyasına çift
tıklarsanız karşınıza ayrı bir konfigürasyon editörü gelecektir. Bu
editör içerisinde "Capabilities" tabına geçip "Location"
checkbox'ını işaretlememiz gerek. Böylece sistem bize Geolocation
API'lerini kullanma izni verecektir.

Tabi sadece sistemin bu izni vermesi yetmez :) Kullanıcının da vermesi
gerek.

Kullanıcıdan konumunu öğrenebilme izni alıyoruz.
Kullanıcıdan konumunu öğrenebilme izni alıyoruz.

Uygulamamızı ilk çalıştırdığımızda hemen Geolocation API'sini
çağırdığımızda için sistem kullanıcıya yukarıdaki uyarıyı göstererek
lokasyon bilgisinin uygulamamıza sağlanıp sağlanmayacağını soruyor.
"Allow" ile izin verirsek artık GPS bilgisini TextBlock'larımızda
görüyoruz.

Aldığım GPS sonuçları.
Aldığım GPS sonuçları.

Şimdi esas ilginç bilgiyi veriyorum :) Bu uygulamayı çalıştırdığım
makinede GPS sensörü yok :) Yani daha önce de anlattığım gibi
pozisyonumu internet bağlantım üzerinden yola çıkarak elde ettiği
bilgilerle belirliyor. Enlem ve Boylam bilgilerine göre ben şu anda
Sirkeci civarındayım :) ki aslında Şişli'deyim. Accuracy değeri Double
ve Metre olduğunu ele alırsak ortalama 1.6km'lik bir kayma payı
olabileceğini bildirmiş bize API'ler ama verdiği lokasyondan 3.7km
uzaktayım kuş uçuşu :) Neyse zaten GPS'i, GSM'i olmayan bir cihazda
bence şehri doğru alabilmek bile yeterli :)

Geolocation API'nin GPS ve GSM'siz hali :)
Geolocation API'nin GPS ve GSM'siz hali :)

Coordinate dışında argümanımızla beraber CivicAddress başlığı
altında bulunduğumuz ülke, şehir gibi bilgiler de geliyor. Bu bilgilerin
bazıları Accuracy'ye göre boş gelse de en azından ülke bilgisinin her
zaman geldiğini söyleyebilirim. İncelemenizde fayda var ;) Unutmadan,
bilgilerde aslında Altitude de var ama ben makalede kullanmadım.
Haberiniz olsun :)

Hepiniz kolay gelsin!

Bu makale Visual Studio 11 Express for Windows Developer Preview
ve Windows 8 Developer Preview Build 8102 kullanılarak yazılmıştır.