Mendapatkan lokasi pengguna

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.

  1. Di Penjelajah Solusi, klik ganda Package.appxmanifest dan pilih tab Kemampuan.
  2. 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.