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

0 dakikada yazıldı

35043 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\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.