Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Önemli
UWP MapControl ve Windows Haritalar platform API'leri (Windows.Services.Maps.*) kullanım dışıdır ve Windows'un gelecekteki sürümlerinde kullanılamayabilir. Daha fazla bilgi için bkz. Kullanım dışı bırakılan özellikler için kaynaklar.
Önemli
Bing Maps for Enterprise hizmetinin kullanımdan kaldırılması
UWP MapControl ve Windows.Services.Maps ad alanlarındaki harita hizmetleri Bing Haritalar'a dayanır. Bing Kurumsal Haritalar kullanımdan kaldırılmıştır ve kullanımdan kaldırılacaktır. Bu noktada MapControl ve hizmetler artık veri almaz.
Daha fazla bilgi için Bing Haritalar Geliştirici Merkezi ve Bing Haritalar belgelerine bakın.
Uyarı
MapControl ve harita hizmetleri, MapServiceTokenadlı bir haritalar kimlik doğrulama anahtarı gerektirir. Haritalar kimlik doğrulama anahtarını alma ve ayarlama hakkında daha fazla bilgi için bkz. Haritalar kimlik doğrulama anahtarı isteme.
Kullanıcının konumunu bulun ve konumdaki değişikliklere yanıt verin. Kullanıcının konumuna erişim, Windows Ayarları'ndaki gizlilik ayarları tarafından yönetilir. Bu konu başlığında ayrıca uygulamanızın kullanıcının konumuna erişim izni olup olmadığının nasıl denetlendiği de gösterilir.
Konum özelliğini etkinleştirme
- Çözüm Gezgini'nde package.appxmanifest dosyasına çift tıklayın ve Özellikler sekmesini seçin.
-
Özellikler listesinde Konum kutusunu işaretleyin. Bu, paket bildirim dosyasına
locationcihaz özelliğini ekler.
<Capabilities>
<!-- DeviceCapability elements must follow Capability elements (if present) -->
<DeviceCapability Name="location"/>
</Capabilities>
Geçerli konumu al.
Bu bölümde , Windows.Devices.Geolocation ad alanında API'leri kullanarak kullanıcının coğrafi konumunun nasıl algılandığı açıklanmaktadır.
1. Adım: Kullanıcının konumuna erişim isteme
Uygulamanızın daha büyük bir konum özelliği yoksa (nota bakın), konuma erişmeye çalışmadan önce RequestAccessAsync yöntemini kullanarak kullanıcının konumuna erişim istemeniz gerekir. Ui iş parçacığından RequestAccessAsync yöntemini çağırmanız ve uygulamanızın ön planda olması gerekir. Uygulamanız, kullanıcı uygulamanıza izin verene kadar kullanıcının konum bilgilerine erişemez.*
using Windows.Devices.Geolocation;
...
var accessStatus = await Geolocator.RequestAccessAsync();
RequestAccessAsync yöntemi, kullanıcıdan konumuna erişmek için izin ister. Kullanıcıya her uygulama için yalnızca bir kez istek gönderilir. İlk kez izin verdikten veya izni reddettikten sonra, bu yöntem artık kullanıcıdan izin istemez. İstendikten sonra kullanıcının konum izinlerini değiştirmesine yardımcı olmak için, bu konunun ilerleyen bölümlerinde gösterildiği gibi konum ayarlarına bir bağlantı sağlamanızı öneririz.
Uyarı
Kaba konum özelliği, uygulamanızın kullanıcının açık iznini almadan kasıtlı olarak belirsiz (kesin olmayan) bir konum almasını sağlar; ancak, sistem genelinde konum anahtarı yine de açık olmalıdır. Uygulamanızda kaba konum kullanmayı öğrenmek için
2. Adım: Kullanıcının konumunu alma ve konum izinlerindeki değişikliklere kaydolma
GetGeopositionAsync yöntemi geçerli konumun tek seferlik bir okumasını gerçekleştirir. Burada, yalnızca kullanıcının konumuna erişime izin verildiğinde işlem yapmak için switch (önceki örnekten) ile bir deyim kullanılır. Kullanıcının konumuna erişime izin verilirse kod bir Geolocator nesnesi oluşturur, konum izinlerindeki değişikliklere kaydolup kullanıcının konumunu ister.
switch (accessStatus)
{
case GeolocationAccessStatus.Allowed:
_rootPage.NotifyUser("Waiting for update...", NotifyType.StatusMessage);
// If DesiredAccuracy or DesiredAccuracyInMeters are not set (or value is 0), DesiredAccuracy.Default is used.
Geolocator geolocator = new Geolocator { DesiredAccuracyInMeters = _desireAccuracyInMetersValue };
// Subscribe to the StatusChanged event to get updates of location status changes.
_geolocator.StatusChanged += OnStatusChanged;
// Carry out the operation.
Geoposition pos = await geolocator.GetGeopositionAsync();
UpdateLocationData(pos);
_rootPage.NotifyUser("Location updated.", NotifyType.StatusMessage);
break;
case GeolocationAccessStatus.Denied:
_rootPage.NotifyUser("Access to location is denied.", NotifyType.ErrorMessage);
LocationDisabledMessage.Visibility = Visibility.Visible;
UpdateLocationData(null);
break;
case GeolocationAccessStatus.Unspecified:
_rootPage.NotifyUser("Unspecified error.", NotifyType.ErrorMessage);
UpdateLocationData(null);
break;
}
3. Adım: Konum izinlerindeki değişiklikleri işleme
Geolocator nesnesi, kullanıcının konum ayarlarının değiştiğini belirtmek için StatusChanged olayını tetikler. Bu olay bağımsız değişkenin Durum özelliği aracılığıyla ilgili durumu geçirir (PositionStatustürü). Bu yöntemin ui iş parçacığından çağrılmadığını ve Dispatcher nesnesinin kullanıcı arabirimi değişikliklerini çağırdığını unutmayın.
using Windows.UI.Core;
...
async private void OnStatusChanged(Geolocator sender, StatusChangedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
// Show the location setting message only if status is disabled.
LocationDisabledMessage.Visibility = Visibility.Collapsed;
switch (e.Status)
{
case PositionStatus.Ready:
// Location platform is providing valid data.
ScenarioOutput_Status.Text = "Ready";
_rootPage.NotifyUser("Location platform is ready.", NotifyType.StatusMessage);
break;
case PositionStatus.Initializing:
// Location platform is attempting to acquire a fix.
ScenarioOutput_Status.Text = "Initializing";
_rootPage.NotifyUser("Location platform is attempting to obtain a position.", NotifyType.StatusMessage);
break;
case PositionStatus.NoData:
// Location platform could not obtain location data.
ScenarioOutput_Status.Text = "No data";
_rootPage.NotifyUser("Not able to determine the location.", NotifyType.ErrorMessage);
break;
case PositionStatus.Disabled:
// The permission to access location data is denied by the user or other policies.
ScenarioOutput_Status.Text = "Disabled";
_rootPage.NotifyUser("Access to location is denied.", NotifyType.ErrorMessage);
// Show message to the user to go to location settings.
LocationDisabledMessage.Visibility = Visibility.Visible;
// Clear any cached location data.
UpdateLocationData(null);
break;
case PositionStatus.NotInitialized:
// The location platform is not initialized. This indicates that the application
// has not made a request for location data.
ScenarioOutput_Status.Text = "Not initialized";
_rootPage.NotifyUser("No request for location is made yet.", NotifyType.StatusMessage);
break;
case PositionStatus.NotAvailable:
// The location platform is not available on this version of the OS.
ScenarioOutput_Status.Text = "Not available";
_rootPage.NotifyUser("Location is not available on this version of the OS.", NotifyType.ErrorMessage);
break;
default:
ScenarioOutput_Status.Text = "Unknown";
_rootPage.NotifyUser(string.Empty, NotifyType.StatusMessage);
break;
}
});
}
Konum güncelleştirmelerini yanıtlama
Bu bölümde, belirli bir süre boyunca kullanıcının konumunun güncelleştirmelerini almak için PositionChanged olayının nasıl kullanılacağı açıklanmaktadır. Kullanıcı herhangi bir zamanda konuma erişimi iptal edebileceğinden , RequestAccessAsync çağrısı yapmak ve önceki bölümde gösterildiği gibi StatusChanged olayını kullanmak önemlidir.
Bu bölümde, ön plan uygulamanızın kullanıcı arabirimi iş parçacığından konum özelliğini etkinleştirdiğiniz ve RequestAccessAsync olarak adlandırdığınız varsayılır.
1. Adım: Rapor aralığını tanımlama ve konum güncelleştirmelerine kaydolma
Bu örnekte, yalnızca kullanıcının konumuna erişime izin verildiğinde işlem yapmak için switch (önceki örnekten) ile bir deyim kullanılır. Kullanıcının konumuna erişime izin verilirse, kod bir Geolocator nesnesi oluşturur, izleme türünü belirtir ve konum güncelleştirmeleri için kaydeder.
Geolocator nesnesi, konum değişikliğine (mesafe tabanlı izleme) veya zaman değişikliğine (periyodik tabanlı izleme) göre PositionChanged olayını tetikleyebilir.
- Mesafe tabanlı izleme için MovementThreshold özelliğini ayarlayın.
- Düzenli aralıklı izleme için ReportInterval özelliğini ayarlayın.
Her iki özellik de ayarlanmadıysa, her 1 saniyede bir konum döndürülür (ReportInterval = 1000'e eşdeğer). Burada 2 saniyelik (ReportInterval = 2000) bir rapor aralığı kullanılır.
using Windows.Devices.Geolocation;
...
var accessStatus = await Geolocator.RequestAccessAsync();
switch (accessStatus)
{
case GeolocationAccessStatus.Allowed:
// Create Geolocator and define periodic-based tracking (2 second interval).
_geolocator = new Geolocator { ReportInterval = 2000 };
// Subscribe to the PositionChanged event to get location updates.
_geolocator.PositionChanged += OnPositionChanged;
// Subscribe to StatusChanged event to get updates of location status changes.
_geolocator.StatusChanged += OnStatusChanged;
_rootPage.NotifyUser("Waiting for update...", NotifyType.StatusMessage);
LocationDisabledMessage.Visibility = Visibility.Collapsed;
StartTrackingButton.IsEnabled = false;
StopTrackingButton.IsEnabled = true;
break;
case GeolocationAccessStatus.Denied:
_rootPage.NotifyUser("Access to location is denied.", NotifyType.ErrorMessage);
LocationDisabledMessage.Visibility = Visibility.Visible;
break;
case GeolocationAccessStatus.Unspecified:
_rootPage.NotifyUser("Unspecified error!", NotifyType.ErrorMessage);
LocationDisabledMessage.Visibility = Visibility.Collapsed;
break;
}
2. Adım: Konum güncelleştirmelerini işleme
Geolocator nesnesi, nasıl yapılandırdığınıza bağlı olarak kullanıcının konumunun değiştiğini veya zamanının geçtiğini göstermek için PositionChanged olayını tetikler. Bu olay, bağımsız değişkenin
using Windows.UI.Core;
...
async private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
_rootPage.NotifyUser("Location updated.", NotifyType.StatusMessage);
UpdateLocationData(e.Position);
});
}
Konum gizlilik ayarlarını değiştirme
Konum gizlilik ayarları uygulamanızın kullanıcının konumuna erişmesine izin vermiyorsa Ayarlar'dakikonum gizlilik ayarlarına uygun bir bağlantı sağlamanızı öneririz. Bu örnekte, köprü denetimi ms-settings:privacy-location URI'sine gitmek için kullanılır.
<!--Set Visibility to Visible when access to location is denied -->
<TextBlock x:Name="LocationDisabledMessage" FontStyle="Italic"
Visibility="Collapsed" Margin="0,15,0,0" TextWrapping="Wrap">
<Run Text="This app is not able to access Location. Go to "/>
<Hyperlink NavigateUri="ms-settings:privacy-location">
<Run Text="Settings"/>
</Hyperlink>
<Run Text=" to check the location privacy settings."/>
</TextBlock>
Alternatif olarak uygulamanız, Ayarlar'ı koddan başlatmak için LaunchUriAsync yöntemini çağırabilir. Daha fazla bilgi için bkz. Windows Ayarlarını Başlatma.
using Windows.System;
...
bool result = await Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
Uygulamanızın sorunlarını giderme
Uygulamanızın kullanıcının konumuna erişebilmesi için önce cihazda Konum'un etkinleştirilmesi gerekir. Ayarlar'da aşağıdaki konum gizlilik ayarlarının açık olup olmadığını denetleyin:
- Bu cihaz için konum ... etkin (Windows 10 Mobile'da geçerli değildir)
- Konum hizmetleri ayarı, Konum, açık durumda
Konumunuzu kullanabilecek uygulamaları seçin altında, uygulamanız'daolarak ayarlanır
İlgili konular
- UWP coğrafi konum örneği
- Coğrafi çit için tasarım yönergeleri
- Konum algılamalı uygulamalar için tasarım yönergeleri