Windows Phone Tips & Tricks. Cómo obtener la posición actual del teléfono

[Nota: Este artículo pertenece a la serie de Windows Phone Tips & Tricks de MSDN España]

Hola,

En una de mis apps para Windows Phone 7 necesito capturar con el GPS la posición actual del teléfono, una única posición. Para eso utilizo un código como el siguiente:

using System;
using System.Device.Location;

namespace MyApp.Services
{
    public delegate void GeolocalizationCallbackType(double Latitud, double Longitude);

    // Geolocalización
    public class GeolocalizationService
    {
        // Servicio para la geolocalización
        private GeoCoordinateWatcher _geoCoordinateWatcher;

        // Método al que hay que llamar cuando consigamos la posición
        private GeolocalizationCallbackType _callback;

        // Constructor
        public GeolocalizationService()
        {
        }

        // Captura las coordenadas de una única posición
        public void CaptureCoordinates(GeolocalizationCallbackType callback)
        {
            if (this._geoCoordinateWatcher == null)
            {
                this._geoCoordinateWatcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default);
                this._geoCoordinateWatcher.MovementThreshold = 1000;
                this._geoCoordinateWatcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(this.GeoCoordinateWatcher_StatusChanged);
                this._geoCoordinateWatcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(this.GeoCoordinateWatcher_PositionChanged);
            }
            this._callback = callback;
            this._geoCoordinateWatcher.Start();
        }

        // El estado del servicio de geolocalización ha cambiado
        private void GeoCoordinateWatcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
        {
            // Chequea si ha habido algún error
            switch (e.Status)
            {
                case GeoPositionStatus.Disabled:
                    this._geoCoordinateWatcher.Stop();
                    break;

                case GeoPositionStatus.NoData:
                    this._geoCoordinateWatcher.Stop();
                    break;
            }
        }

        // Ha cambiado la posición del usuario. Captúrala
        private void GeoCoordinateWatcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
        {
            if (e.Position.Location.IsUnknown)
            {
                // Aún no tenemos una posición. No hagas nada
                return;
            }

            // Todo ha ido bien. Devuelve la posición a quien la pidió
            if (this._callback != null)
            {
                this._callback(e.Position.Location.Latitude, e.Position.Location.Longitude);
            }

            // Para el servicio de localización. El usuario sólo necesita una posición
            this._geoCoordinateWatcher.Stop();
        }
    }
}

Para utilizar esta clase uso un código como este:

GeolocalizationService geolocalizationService = new GeolocalizationService();

// Captura la posición y guárdala en mi objeto cuando la tengas
geolocalizationService.CaptureCoordinates((latitude, longitude) => {
    this.Latitude = latitude;
    this.Longitude = longitude;
}
);

Ahora en Windows Phone 8 realizar esta misma operación es bastante más sencillo, y se hace con el mismo código que utilizaríamos en una app de la Tienda Windows 8:

using System;
using Windows.Devices.Geolocation;

namespace MyApp.Services
{
    public delegate void GeolocalizationCallbackType(double Latitud, double Longitude);

    // Geolocalización
    public class GeolocalizationService
    {
        // Constructor
        public GeolocalizationService()
        {
        }

        // Captura las coordenadas de una única posición
        public async void CaptureCoordinates(GeolocalizationCallbackType callback)
        {
            try
            {
                Geolocator locator = new Geolocator();
                locator.DesiredAccuracy = PositionAccuracy.Default;
                Geoposition position = await locator.GetGeopositionAsync();
                callback(position.Coordinate.Latitude, position.Coordinate.Longitude);
            }
            catch (Exception)
            {
            }
        }
    }
}

Y esta clase la uso con el mismo código que la de Windows Phone 7.

Espero que te sea de utilidad.

Un saludo,

Alejandro Campos Magencio (@alejacma)

PD: Mantente informado de todas las novedades de Microsoft para los desarrolladores españoles a través del Twitter de MSDN, el Facebook de MSDN, el Blog de MSDN y la Newsletter MSDN Flash.

About these ads

Un pensamiento en “Windows Phone Tips & Tricks. Cómo obtener la posición actual del teléfono

  1. Pingback: Tips & Tricks de desarrollo para Windows Phone - MSDN España - Site Home - MSDN Blogs

Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s