Selamlar, bu makalemde yakın zamanda karşılaştığım bir konu hakkında çözümümü ele alacağım.
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
Ancak bir problem şu ki
.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:
.NET Core 3.1 ile GeoWinTP adında bir konsol uygulaması oluşturuyorum ve projeye
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:
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.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:
Call Windows Runtime APIs in desktop apps - Windows apps
Enhance your desktop application for Windows users by using Windows Runtime APIs.
learn.microsoft.com
Windows.Devices.Geolocation Namespace - Windows apps
Provides APIs for getting the current location or tracking the device's location over time. Location information may come from estimating a position from beacons like Wi-Fi access points and cell towers, from the device's IP address, or it may come from other sources such as a GNSS or GPS...
learn.microsoft.com
Geolocation - .NET MAUI
Learn how to use the .NET MAUI IGeolocation interface in the Microsoft.Maui.Devices.Sensors namespace. This interface provides API to retrieve the device's current geolocation coordinates.
learn.microsoft.com
Son düzenleme: