Detectar la ubicación del usuario
Idioma: HTML | XAML

Detectar la ubicación del usuario (XAML)

[ Este artículo está destinado a desarrolladores de Windows 8.x y Windows Phone 8.x que escriben aplicaciones de Windows en tiempo de ejecución. Si estás desarrollando para Windows 10, consulta la documentación más reciente

Obtén información sobre cómo detectar la ubicación geográfica del usuario mediante las API del espacio de nombres Windows.Devices.Geolocation. En este tema se usan ejemplos de código, basados en la muestra de geolocalización, para mostrar puntos clave. Para obtener más información, descarga y ejecuta la muestra.

Guía básica: Relación de este tema con los demás. Consulta:

Paso 1: Comprobar que la ubicación esté habilitada

Antes de que la aplicación pueda tener acceso a la ubicación, la Ubicación debe estar habilitada en el dispositivo. En la aplicación Configuración, comprueba que la siguiente configuración de privacidad de ubicación esté activada:

  • La ubicación de este dispositivo... está activada (no es aplicable para Windows 10 Mobile)
  • La configuración de servicios de ubicación, "Ubicación", está activada
  • En Elegir las aplicaciones que pueden usar tu ubicación, la aplicación está establecida en activada

Paso 2: Habilitar la capacidad de ubicación

Haz doble clic en package.appxmanifest en el Explorador de soluciones y selecciona la pestaña Funcionalidades. A continuación, activa Ubicación en la lista Funcionalidades. De esta forma, se agrega la funcionalidad Location del dispositivo en el archivo de manifiesto del paquete.


  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

Paso 3: Solicitar acceso a la ubicación del usuario

Solicita acceso a la ubicación del usuario con el método RequestAccessAsync.

Importante  A partir de Windows 10, llama a RequestAccessAsync antes de acceder a la ubicación del usuario. En ese momento, la aplicación debe estar en primer plano y se debe llamar a RequestAccessAsync desde el subproceso de la interfaz de usuario. La aplicación no puede acceder a los datos de ubicación hasta que el usuario no conceda permiso para que tu aplicación obtenga su ubicación.
 


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

El método RequestAccessAsync pide permiso al usuario para tener acceso a su ubicación. Solo se pide confirmación al usuario una vez (por aplicación). Una vez el usuario ha concedido o denegado el permiso, este método ya no vuelve a solicitarlo. Para ayudar al usuario a cambiar los permisos de ubicación una vez se hayan solicitado, te recomendamos que proporciones un vínculo a la configuración de ubicación, tal como se muestra más adelante en este tema.

Paso 4: Obtener ubicación del usuario y registrar los cambios en los permisos de ubicación

El método GetGeopositionAsync realiza una lectura única de la ubicación actual. En este caso, se usa una instrucción switch con accessStatus (del ejemplo anterior) para que actúe solamente cuando se permita el acceso a la ubicación. Si se permite, el código crea un objeto Geolocator, registra los cambios en los permisos de ubicación y solicita la ubicación de los usuarios.


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

Paso 5: Controlar cambios en los permisos de ubicación

El objeto Geolocator desencadena el evento StatusChanged para indicar que se ha modificado la configuración de ubicación del usuario. Ese evento pasa el estado correspondiente mediante la propiedad Status del argumento (de tipo PositionStatus). Ten en cuenta que no se llama a este método desde el subproceso de interfaz de usuario y el objeto Dispatcher invoca los cambios de la interfaz de usuario.



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 cached location data if any
                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;
        }
    });
}

Paso 6: Ayudar al usuario a cambiar la configuración de ubicación

Si la configuración de ubicación no permite que la aplicación acceda a la ubicación del usuario, te recomendamos que proporciones un vínculo práctico a la configuración de privacidad de ubicación en la aplicación Configuración. En este ejemplo, se usa un control de hipervínculo para navegar al URI ms-settings:privacy-location.


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

Como alternativa, la aplicación puede llamar al método LaunchUriAsync para iniciar la aplicación Configuración desde el código. Para obtener más información, consulta Cómo iniciar la aplicación Configuración.


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

Temas relacionados

Muestra de geolocalización de Windows 10
Muestra de geolocalización de Windows 8.1
Muestras de SDK de Mapas de Bing
Windows.Devices.Geolocation
Directrices para usar dispositivos con información confidencial

 

 

Mostrar:
© 2017 Microsoft