Mendapatkan lokasi pengguna

Catatan

Layanan MapControl dan peta memerlukan kunci autentikasi peta yang disebut MapServiceToken. Untuk informasi selengkapnya tentang mendapatkan dan mengatur kunci autentikasi peta, lihat Meminta kunci autentikasi peta.

Temukan lokasi pengguna dan tanggapi perubahan di lokasi. Akses ke lokasi pengguna dikelola oleh pengaturan privasi di aplikasi Pengaturan. Topik ini juga menunjukkan cara memeriksa apakah aplikasi Anda memiliki izin untuk mengakses lokasi pengguna.

Tips Untuk mempelajari selengkapnya tentang mengakses lokasi pengguna di aplikasi Anda, unduh sampel berikut dari repositori Windows-universal-samples di GitHub.

Mengaktifkan kapabilitas lokasi

  1. Di Penjelajah Solusi, klik ganda package.appxmanifest dan pilih tab Kemampuan .
  2. Di daftar Kapabilitas , centang kotak untuk Lokasi. Ini menambahkan location kemampuan perangkat ke file manifes paket.
  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

Dapatkan lokasi saat ini

Bagian ini menjelaskan cara mendeteksi lokasi geografis pengguna menggunakan API di namespace Windows.Devices.Geolocation .

Langkah 1: Meminta akses ke lokasi pengguna

Kecuali aplikasi Anda memiliki kemampuan lokasi yang kasar (lihat catatan), Anda harus meminta akses ke lokasi pengguna dengan menggunakan metode RequestAccessAsync sebelum mencoba mengakses lokasi. Anda harus memanggil metode RequestAccessAsync dari utas UI dan aplikasi Anda harus berada di latar depan. Aplikasi Anda tidak akan dapat mengakses informasi lokasi pengguna hingga pengguna memberikan izin ke aplikasi Anda.*

using Windows.Devices.Geolocation;
...
var accessStatus = await Geolocator.RequestAccessAsync();

Metode RequestAccessAsync meminta izin kepada pengguna untuk mengakses lokasi mereka. Pengguna hanya diminta sekali (per aplikasi). Setelah pertama kali mereka memberikan atau menolak izin, metode ini tidak lagi meminta izin kepada pengguna. Untuk membantu pengguna mengubah izin lokasi setelah diminta, kami sarankan Anda menyediakan tautan ke pengaturan lokasi seperti yang ditunjukkan nanti dalam topik ini.

Catatan: Fitur lokasi kasar memungkinkan aplikasi Anda untuk mendapatkan lokasi yang sengaja dikaburkan (tidak tepat) tanpa mendapatkan izin eksplisit pengguna (sakelar lokasi di seluruh sistem masih harus aktif). Untuk mempelajari cara menggunakan lokasi kasar di aplikasi Anda, lihat metode AllowFallbackToConsentlessPositions di kelas Geolocator .

Langkah 2: Dapatkan lokasi pengguna dan daftar untuk perubahan izin lokasi

Metode GetGeopositionAsync melakukan pembacaan satu kali dari lokasi saat ini. Di sini, pernyataan sakelar digunakan dengan accessStatus (dari contoh sebelumnya) untuk bertindak hanya saat akses ke lokasi pengguna diizinkan. Jika akses ke lokasi pengguna diizinkan, kode membuat objek Geolocator , mendaftar untuk perubahan izin lokasi, dan meminta lokasi pengguna.

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;
}

Langkah 3: Menangani perubahan izin lokasi

Objek Geolokator memicu peristiwa StatusChanged untuk menunjukkan bahwa pengaturan lokasi pengguna berubah. Kejadian tersebut melewati status yang sesuai melalui properti Status argumen (dari jenis PositionStatus). Perhatikan bahwa metode ini tidak dipanggil dari utas UI dan objek Dispatcher memanggil perubahan UI.

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;
        }
    });
}

Merespons pembaruan lokasi

Bagian ini menjelaskan cara menggunakan peristiwa PositionChanged untuk menerima pembaruan lokasi pengguna selama periode waktu tertentu. Karena pengguna dapat mencabut akses ke lokasi kapan saja, penting untuk memanggil RequestAccessAsync dan menggunakan peristiwa StatusChanged seperti yang ditunjukkan di bagian sebelumnya.

Bagian ini mengasumsikan bahwa Anda telah mengaktifkan kemampuan lokasi dan disebut RequestAccessAsync dari utas UI aplikasi latar depan Anda.

Langkah 1: Tentukan interval laporan dan daftar untuk pembaruan lokasi

Dalam contoh ini, pernyataan sakelar digunakan dengan accessStatus (dari contoh sebelumnya) untuk bertindak hanya saat akses ke lokasi pengguna diizinkan. Jika akses ke lokasi pengguna diizinkan, kode membuat objek Geolocator , menentukan jenis pelacakan, dan mendaftar untuk pembaruan lokasi.

Objek Geolokator dapat memicu peristiwa PositionChanged berdasarkan perubahan posisi (pelacakan berbasis jarak) atau perubahan waktu (pelacakan berbasis berkala).

Jika tidak ada properti yang diatur, posisi dikembalikan setiap 1 detik (setara dengan ReportInterval = 1000). Di sini, interval laporan 2 detik (ReportInterval = 2000) digunakan.

using Windows.Devices.Geolocation;
...
var accessStatus = await Geolocator.RequestAccessAsync();

switch (accessStatus)
{
    case GeolocationAccessStatus.Allowed:
        // Create Geolocator and define perodic-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("Unspecificed error!", NotifyType.ErrorMessage);
        LocationDisabledMessage.Visibility = Visibility.Collapsed;
        break;
}

Langkah 2: Menangani pembaruan lokasi

Objek Geolokator memicu peristiwa PositionChanged untuk menunjukkan bahwa lokasi pengguna berubah atau waktu telah berlalu, tergantung pada cara Anda mengonfigurasinya. Kejadian tersebut melewati lokasi yang sesuai melalui properti Posisi argumen (dari jenis Geoposisi). Dalam contoh ini, metode tidak dipanggil dari utas UI dan objek Dispatcher memanggil perubahan UI.

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);
    });
}

Mengubah pengaturan privasi lokasi

Jika pengaturan privasi lokasi tidak mengizinkan aplikasi Anda mengakses lokasi pengguna, kami sarankan Anda menyediakan tautan yang nyaman ke pengaturan privasi lokasi di aplikasi Pengaturan . Dalam contoh ini, kontrol Hyperlink digunakan menavigasi ke ms-settings:privacy-location URI.

<!--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>

Atau, aplikasi Anda dapat memanggil metode LaunchUriAsync untuk meluncurkan aplikasi Pengaturan dari kode. Untuk informasi selengkapnya, lihat Meluncurkan aplikasi Pengaturan Windows.

using Windows.System;
...
bool result = await Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));

Memecahkan masalah aplikasi Anda

Sebelum aplikasi Anda dapat mengakses lokasi pengguna, Lokasi harus diaktifkan di perangkat. Di aplikasi Pengaturan , periksa apakah pengaturan privasi lokasi berikut diaktifkan:

  • Lokasi untuk perangkat ini...diaktifkan (tidak berlaku di Windows 10 Mobile)
  • Pengaturan layanan lokasi, Lokasi, diaktifkan
  • Di bawah Pilih aplikasi yang dapat menggunakan lokasi Anda, aplikasi Anda diatur ke aktif