Rehber C# .NET projelerinde UWP olmadan Geolocation ile konum bilgisi nasıl alınır?

Selamlar, bu makalemde yakın zamanda karşılaştığım bir konu hakkında çözümümü ele alacağım.

How to Use Geolocation Push Notifications the Right Way


Windows ortamında yazılım geliştirirken şöyle bir ihtiyacınızın olduğunu düşünün: Windows 10/11 kullanıcısının konum bilgilerini enlem ve boylam olarak Wi-Fi, GPS, hücresel ağ, IP adresi gibi müsait kaynaklardan biriyle edinen .NET arka plan servisi veya bir konsol uygulaması. Bu ihtiyacı istediğiniz bir senaryoya uyarlayabilirsiniz, mesela uzaktan eğitim sisteminde öğrencinin konum takibinin yapılması örneğini ele alalım. Bu uygulama düzenli olarak arka planda çalışarak öğrencinin konum bilgisini elde etmemizi sağlayacak.

Windows 10 veya 11'de bu gereksinimi karşılamak için Windows Runtime (WinRT) isminde bir API var. Bu altyapı özellikle Windows 10 ve sonrasında hayatımıza giren modern uygulama tiplerinin (UWP, WinUI, MAUI...) donanıma ve sistem servislerine güvenli erişebilmesini sağlıyor. İşte WinRT'nin içerisinde bulunan Windows.Devices.Geolocation ismindeki namespace'de GPS, Wi-Fi, hücresel veri ve IP adresi gibi seçenekleri kullanarak cihazın coğrafi konumunu almaya veya gerçek zamanlı olarak konum değişikliklerini izlemeye olanak tanıyor.

PPT - Introducing Windows Runtime PowerPoint Presentation, free download -  ID:6190144


Ancak bir problem şu ki Windows.Devices.Geolocation namespace'ini sadece UWP'de destekleniyor. Sadece coğrafi konum değişikliğini izleyip başka bir uygulamaya gönderecek basit bir servis için UWP, MAUI kullanmak açıkçası çok verimsiz. Bunlarda arayüzü tamamen devre dışı bırakmak çok olası değil ve arka plan uygulaması olarak çalışma mantığına da sahip sayılmazlar. Peki ne yapacağız?

.NET Core 5'in altı versiyonlardaki WinForm, konsol uygulaması, Background Service ve diğer .NET proje türlerinde WinRT API içerisindeki bileşenlere erişmenin dolaylı bir yolu var: Microsoft.Windows.SDK.Contracts NuGet paketi. Kamera, sensör, GPS ve konum gibi donanım erişimlerine ihtiyaç varsa bu paketi kullanabiliyoruz ve UWP bağımlılığı ortadan kalkıyor. Peki nasıl kullanıyoruz bunu açıklayayım.

.NET Core 3.1 ile GeoWinTP adında bir konsol uygulaması oluşturuyorum ve projeye Microsoft.Windows.SDK.Contracts NuGet paketini ekliyorum. Aşağıdaki kodda her kısmı yorum satırlarıyla açıkladım. Bu program temel olarak: kullanıcıdan konum izni alır, Geolocation ile konumu uygun bir şekilde alıp enlem ve boylam olarak sunarak Google Maps linki ile birlikte masaüstüne .json dosyası olarak kaydeder.

C#:
// Gerekli kütüphaneler import ediliyor
using System;
using System.IO;
using System.Text.Json;
using System.Threading.Tasks;
using Windows.Devices.Geolocation;

namespace GeoWinTP
{
    class Program
    {
        // Ana giriş noktası (asenkron Main metodu)
        static async Task Main(string[] args)
        {
            // Kullanıcıdan konum izni isteniyor
            var accessStatus = await Geolocator.RequestAccessAsync();

            // Eğer konum izni verilmemişse, kullanıcıyı ayarlar sayfasına yönlendir
            if (accessStatus != GeolocationAccessStatus.Allowed)
            {
                OpenLocationSettings(); // Konum ayarlarını aç
                Console.ReadLine();     // Konsolun kapanmaması için kullanıcı girişi bekleniyor
                return;                 // Programdan çık
            }

            try
            {
                // Geolocator nesnesi oluşturuluyor, hassasiyet ayarı yapılıyor
                var geolocator = new Geolocator { DesiredAccuracyInMeters = 0 };

                // Asenkron olarak konum bilgisi alınıyor
                var position = await geolocator.GetGeopositionAsync();

                // Enlem ve boylam bilgileri çıkarılıyor
                var latitude = position.Coordinate.Point.Position.Latitude;
                var longitude = position.Coordinate.Point.Position.Longitude;

                // Konum bilgileri konsola yazdırılıyor
                Console.WriteLine("Konum bilgisi alındı:");
                Console.WriteLine($"Enlem: {latitude}");
                Console.WriteLine($"Boylam: {longitude}");

                // Konum bilgileri masaüstüne JSON dosyası olarak kaydediliyor
                SaveLocationToDesktop(latitude, longitude);

                Console.ReadLine(); // Konsolun açık kalması için bekleme
            }
            catch (Exception ex)
            {
                // Eğer konum alınırken hata olursa ekrana yaz
                Console.WriteLine($"Konum alınamadı: {ex.Message}");
                Console.ReadLine();
            }
        }

        // Konum bilgilerini masaüstüne JSON dosyası olarak kaydeden metod
        static void SaveLocationToDesktop(double lat, double lon)
        {
            try
            {
                // Masaüstü dizini alınır
                string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

                // Dosya yolu belirlenir
                string filePath = Path.Combine(desktopPath, "location.json");

                // Google Maps URL’si oluşturulur
                string mapsUrl = $"https://www.google.com/maps?q={lat},{lon}";

                // JSON'a yazılacak anonim nesne oluşturulur
                var locationData = new
                {
                    latitude = lat,
                    longitude = lon,
                    timestamp = DateTime.UtcNow.ToString("o"), // ISO 8601 formatında zaman
                    mapsLink = mapsUrl
                };

                // JSON verisi string'e dönüştürülür
                var json = JsonSerializer.Serialize(locationData, new JsonSerializerOptions { WriteIndented = true });

                // Dosya yazılır
                File.WriteAllText(filePath, json);

                // Başarı mesajı yazdırılır
                Console.WriteLine($"Konum masaüstüne kaydedildi: {filePath}");
            }
            catch (Exception ex)
            {
                // Hata durumunda mesaj yazılır
                Console.WriteLine($"Dosya yazılamadı: {ex.Message}");
            }
        }

        // Konum ayarlarını açan metod (izin verilmediğinde çağrılır)
        static void OpenLocationSettings()
        {
            try
            {
                // Windows Ayarlar > Gizlilik > Konum sekmesini açar
                System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
                {
                    FileName = "ms-settings:privacy-location",
                    UseShellExecute = true
                });

                Console.WriteLine("Konum izni verilmedi. Ayarlar sayfası açıldı.");
            }
            catch (Exception ex)
            {
                // Ayarlar açılamazsa kullanıcıya bilgi ver
                Console.WriteLine($"Ayarlar açılamadı: {ex.Message}");
            }
        }
    }
}

Bu şekilde Windows 10 ve 11 sistemlerde konum bilgilerini alıp çeşitli şekillerde işlemek oldukça kolay hale geliyor. Okuduğunuz için teşekkürler.

Kaynakça:
 
Son düzenleme:

Technopat Haberler

Yeni konular

Geri
Yukarı