martes, 21 de febrero de 2012

Consideraciones para el uso del servicio de localización en Windows Phone

Para continuar con nuestra demo de Bing, antes haremos un apartado para aprender a usar el GPS de nuestros dispositivos con Windows Phone.

Cuando hablamos de usar el GPS generalmente encontraremos el término asociado Location o Localización (en este contexto, ubicación).

En Windows Phone, tenemos la posibilidad de obtener los datos de posición provenientes de múltiples fuentes, tales como GPS, Wi-Fi y la celular, además se puede utilizar uno o más de estas fuentes para eso, sin embargo debemos considerar el equilibrio de rendimiento con relación al uso de la batería de acuerdo a las necesidades de una aplicación teniendo en cuenta que estos dos requisitos de la aplicación tienen una relación inversa.

El hardware que produce información menos precisa sobre la ubicación, como el Wi-Fi y radio celular, utiliza menos energía que el receptor GPS que, en general, puede obtener los datos de localización más precisos. Al diseñar su aplicación, hay dos reglas básicas a seguir: utilice la menor exactitud a menos que su aplicación lo requiera y desactive o apague el servicio cuando no lo esté usando.

Aunque el servicio de localización utiliza múltiples fuentes de información sobre la ubicación, cualquiera de las fuentes pueden no estar disponible, de ahí que al crear la instancia de la clase a través de la que accedemos a datos de localización, el GeoCoordinateWatcher podemos decidir la fuente, bien sea por defecto o alta (Default o High en la enumeración GeoPositionAcurracy)
1:  GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.Default);  
Además, para empezar a usar el servicio de localización es recomendable suscribirnos al evento StatusChanged de la instancia que creemos del GeoCoordinateWatcher el cual nos indica cada vez que el estado del servicio de localización cambia, y lo indica a través de la enumeración GeoPositionStatus cuyos posibles estados son: Disabled, Initializing, NoData y Ready.
1:  watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged);  
2:  watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);  
3:  watcher.Start();  
Otra consideración importante a tener en cuenta es establecer un umbral razonable de movimiento o MovementThreshold. Esta propiedad especifica la distancia entre un cambio de posición y otro que queramos que sea notificado. Si se establece la MovementThreshold propiedad en un valor muy bajo, se pueden recibir señales erradas a causa de ruidos en la señal por la alta sensibilidad. Para suavizar la señal a representar sólo los cambios significativos se puede establecer el MovementThreshold al menos 20 metros. Esto también ayudará a un menor consumo de batería.

Cuando el servicio de localización esta enviando datos se dispara el evento PositionChanged de acuerdo al MovementThreshold que configuramos, en ese momento se entrega un objeto de tipo GeoPosition que consiste en un tiempo de captura y un objeto GeoCoordinate que contiene la latitud y longitud, datos que representan la ubicación.

Para probar el GPS en el emulador tenemos entre las herramientas avanzadas una disponible para este propósito.


Como recomendación final no debemos perder de vista la experiencia de usuario, esto por que la primera lectura del servicio de localización suele durar 15 segundos, pero puede tardar hasta 120 segundos, así que es muy importante comunicarle al usuario de tu aplicación lo que esta ocurriendo y también ubicar barras de progreso.

Debemos tener en cuenta que debido a que aunque el ajuste de precisión baja (o por defecto) no espera al GPS para devolver los datos, por lo general será más rápido si el GPS no ha sido activada. Si otra aplicación está utilizando el GPS y ya está la recuperación de datos, el ajuste de alta precisión devolverá los datos tan rápido o más rápido que el ajuste de baja precisión.

Por último, recuerda que si no vas a usar más el servicio, para optimizar el uso de la batería, debes detenerlo, para eso puedes usar el método Stop a través de tu instancia del GeoCoordinateWatcher.

Los ejemplos de este código son muy sencillos y se encuentran en MSDN por lo que los invito a tomarlos desde allí.

Hasta el próximo post
Sorey
Publicar un comentario