Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Gunakan Windows. Devices.Geolocation API untuk mendeteksi posisi geografis perangkat dalam aplikasi SDK Aplikasi Windows (WinUI 3). Anda bisa mendapatkan perbaikan lokasi satu kali atau melacak posisi pengguna dari waktu ke waktu. Artikel ini membahas penanganan izin, pembacaan lokasi satu kali dan berkelanjutan, dan cara memperbarui UI Anda saat lokasi berubah.
Note
Windows.Devices.Geolocation API adalah API Windows Runtime (WinRT) yang berfungsi di aplikasi desktop UWP dan WinUI 3. Kode dalam artikel ini menggunakan pola WinUI 3 (seperti DispatcherQueue untuk pengalihan eksekusi utas).
Prerequisites
- Proyek WinUI 3 yang dibuat dari templat Blank App, Packaged (WinUI 3 pada Desktop).
- Kemampuan Lokasi dideklarasikan dalam manifes paket (lihat Mengaktifkan kemampuan lokasi).
Mengaktifkan kemampuan lokasi
Aplikasi Anda harus mendeklarasikan kemampuan Lokasi sebelum dapat mengakses posisi pengguna.
- Di Penjelajah Solusi, klik ganda Package.appxmanifest dan pilih tab Kemampuan.
- Centang kotak untuk Lokasi.
Ini menambahkan entri berikut ke manifes:
<Capabilities>
<DeviceCapability Name="location"/>
</Capabilities>
Tip
Untuk aplikasi yang tidak dikemas, kemampuan Lokasi tidak diperlukan dalam manifes. Namun, Anda masih harus memanggil RequestAccessAsync untuk meminta izin kepada pengguna.
Dapatkan lokasi saat ini
Ikuti langkah-langkah berikut untuk melakukan pembacaan posisi satu kali.
Meminta akses ke lokasi pengguna
Panggil Geolocator.RequestAccessAsync sebelum mengakses data lokasi. Metode ini meminta izin kepada pengguna saat pertama kali dijalankan. Anda harus memanggilnya dari thread UI saat aplikasi Anda berada di latar depan.
using Windows.Devices.Geolocation;
var accessStatus = await Geolocator.RequestAccessAsync();
Baca posisi
Jika pengguna memberikan izin, buat Geolocator dan panggil GetGeopositionAsync untuk mendapatkan perbaikan posisi satu kali.
switch (accessStatus)
{
case GeolocationAccessStatus.Allowed:
var geolocator = new Geolocator { DesiredAccuracyInMeters = 50 };
Geoposition position = await geolocator.GetGeopositionAsync();
double latitude = position.Coordinate.Point.Position.Latitude;
double longitude = position.Coordinate.Point.Position.Longitude;
StatusText.Text = $"Location: {latitude:F4}, {longitude:F4}";
break;
case GeolocationAccessStatus.Denied:
StatusText.Text = "Location access is denied.";
break;
case GeolocationAccessStatus.Unspecified:
StatusText.Text = "An unspecified error occurred.";
break;
}
Melacak lokasi pengguna dari waktu ke waktu
Untuk menerima pembaruan lokasi secara berkala, berlangganan ke event PositionChanged. Atur ReportInterval untuk pelacakan berbasis waktu atau MovementThreshold untuk pelacakan berbasis jarak.
if (accessStatus == GeolocationAccessStatus.Allowed)
{
var geolocator = new Geolocator { ReportInterval = 2000 }; // 2-second interval
geolocator.PositionChanged += OnPositionChanged;
geolocator.StatusChanged += OnStatusChanged;
}
Tangani pembaruan posisi
Peristiwa PositionChanged dipicu pada utas latar belakang. Gunakan DispatcherQueue untuk mengarahkan pembaruan UI kembali ke utas utama.
private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
DispatcherQueue.TryEnqueue(() =>
{
var position = args.Position.Coordinate.Point.Position;
StatusText.Text = $"Updated: {position.Latitude:F4}, {position.Longitude:F4}";
});
}
Menangani perubahan status
Pantau StatusChanged untuk mendeteksi kapan pengguna menonaktifkan layanan lokasi atau sinyal GPS hilang.
private void OnStatusChanged(Geolocator sender, StatusChangedEventArgs args)
{
DispatcherQueue.TryEnqueue(() =>
{
switch (args.Status)
{
case PositionStatus.Ready:
StatusText.Text = "Location is available.";
break;
case PositionStatus.Disabled:
StatusText.Text = "Location is disabled. Check Settings.";
break;
case PositionStatus.NoData:
StatusText.Text = "Unable to determine location.";
break;
case PositionStatus.NotAvailable:
StatusText.Text = "Location is not available on this device.";
break;
}
});
}
Mengarahkan pengguna ke pengaturan lokasi
Jika pengguna menolak akses lokasi, berikan tautan ke pengaturan privasi Windows sehingga mereka dapat mengubah preferensi mereka.
<HyperlinkButton Content="Open location settings"
NavigateUri="ms-settings:privacy-location" />
Anda juga dapat membuka halaman pengaturan dari kode:
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
Perlihatkan lokasi pada peta
Setelah mengambil posisi, Anda dapat menampilkannya pada MapControl WinUI 3 dengan mengatur Center dan menambahkan MapIcon. Untuk contoh kerja lengkap yang menggabungkan geolokasi, tampilan peta, dan geofencing, lihat Gambaran umum Peta dan lokasi.
Troubleshooting
Jika aplikasi Anda tidak dapat mengambil lokasi, verifikasi hal berikut di Pengaturan > Privasi & Lokasi keamanan>:
- Layanan lokasidiaktifkan.
- Aplikasi Anda tercantum dan diatur ke Aktif di bawah Izinkan aplikasi mengakses lokasi Anda.
- Perangkat ini memiliki penerima GPS yang berfungsi atau tersedia penentuan lokasi berbasis jaringan.
Artikel terkait
Windows developer