Vamos a ver cómo crear aplicaciones que utilicen los servicios de localización de Bing y la API dedicada a geo localizar nuestro dispositivo, a través de la cual crearemos una aplicación que pueda localizarnos en un mapa.
Además trabajaremos con el emulador de localización de las herramientas de Windows Phone.
2. Servicio de localización
El servicio de localización en WP7 obtiene los datos
de posicionamiento de:
GPS
WIFI
Radio GSM
El sistema busca el equilibrio entre consumo de
batería y rendimiento, en función de las necesidades
de la aplicación
Interfaz de código orientado a eventos administrados
3. Arquitectura
Tres capas
Hardware (GPS, WIFI, Radio GSM)
Distintos niveles de precisión y consumo energético
No accesible para el desarrollador
Código nativo
Se comunica directamente con la capa Hardware
Decide qué fuentes utilizar basándose en disponibilidad de datos y los
requisitos de rendimiento de la aplicación
También se comunica a través de Internet con un servicio web de Microsoft
Interfaz manejada
DLL incluida con las Windows Phone Developer Tools (System.Device.dll)
Espacio de nombres System.Device.Location
Permite iniciar y parar el servicio, configurar el nivel de precisión y recibir
los datos de la capa nativa*
4. Buenas prácticas
Balance entre la exactitud de los datos de localización
y el consumo de batería
Relación inversa entre exactitud y consumo de
batería
Hardware que proporciona datos menos precisos
consume menos (WiFi y radiotelefonía)
GPS proporciona mayor exactitud a costa de mayor
consumo
Reglas básicas
Utilizar menor precisión siempre que sea posible
Activar el servicio de localización sólo cuando sea necesario y
detenerlo después
5. Acceso al servicio de localización
GeoCoordinateWatcher es la clase principal de
System.Device.Location
Métodos
Start() inicia la adquisición de datos del servicio de
localización (asíncrono)
TryStart() intenta iniciar el servicio durante un intervalo de
tiempo determinado (síncrono)
Stop() detiene la adquisición de datos
Propiedades
MovementThreshold umbral del cambio de posición que
debe tener lugar para que se lance el evento PositionChanged
(valor recomendado: 20 metros)
Eventos
StatusChanged cambio de estado
PositionChanged cambio de posición
6. Servicio de localización
Estados del servicio de localización
Recogidos en la enumeración GeoPositionStatus
Disabled servicio deshabilitado por el
usuario o no soportado por el dispositivo
Initializing el servicio se está inicializando
NoData servicio en funcionamiento pero no
recibe datos de localización
Ready servicio en ejecución y recibiendo
datos
7. Servicio de localización
Nivel de exactitud
El servicio de localización utiliza varias fuentes para
obtener los datos
Es posible que en determinados momentos algunas
de las fuentes no estén disponibles
La capa de código nativo seleccionará la fuente
más adecuada en función de los datos disponibles
Nuestra aplicación únicamente deberá seleccionar
el nivel de precisión de los datos de localización
GeoPositionAccuracy.High
GeoPositionAccuracy.Low
GeocordinateWatcher watcher = new
GeocordinateWatcher(GeoPositionAccuracy.Low);
8. Utilizar el servicio de localización
1. Agregar referencia:
System.Device.dll
Declarar GeoCoordinateWatcher de forma
global para que esté en memoria todo el
2. Directiva Using: tiempo que se muestre la página
using System.Device.Location
3. Añadir objeto GeoCoordinateWatcher
public partial class MainPage : PhoneApplicationPage
{
GeoCoordinateWatcher watcher;
}
9. Aplicación con localización opcional
private void btnIniciar_Click(object sender, RoutedEventArgs e) watcher.Stop();
{ }
if (watcher == null) void watcher_StatusChanged(object sender,
{ GeoPositionStatusChangedEventArgs e)
watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High); {
watcher.MovementThreshold = 20; switch (e.Status)
watcher.StatusChanged += new {
EventHandler<GeoPositionStatusChangedEventArgs>(watcher_Statu
case GeoPositionStatus.Disabled:
sChanged);
if (watcher.Permission == GeoPositionPermission.Denied)
watcher.PositionChanged += new
EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watc txtEstado.Text = “Debe habilitar la localización”
her_PositionChanged); else
} txtEstado.Text = “Servicio no disponible.";
watcher.Start(); break;
} case GeoPositionStatus.Initializing:
btnIniciar.IsEnabled = false;
void watcher_PositionChanged(object sender, break;
GeoPositionChangedEventArgs<GeoCoordinate> e)
case GeoPositionStatus.NoData:
{
txtEstado.Text = “Sin señal";
txtLatitud.Text =
e.Position.Location.Latitude.ToString("0.000"); btnPararServicioLocalizacion.IsEnabled = true;
txtLongitud.Text = break;
e.Position.Location.Longitude.ToString("0.000"); case GeoPositionStatus.Ready:
} txtEstado.Text = “Localización preparada";
btnPararServicioLocalizacion.IsEnabled = true;
private void btnPararServicioLocalizacion_Click(object sender, break;
RoutedEventArgs e)
}
{
}
10. Control BingMaps
1. Crear una cuenta de desarrollador
https://www.bingmapsportal.com/
2. Creamos una nueva Key
Nombre aplicación, URL, tipo de aplicación…..
3. Agregamos la referencia
xmlns:map="clr-namespace:Microsoft.Phone.Controls.
Maps;assembly=Microsoft.Phone.Controls.Maps“
4. Insertamos el control
<map:Map Name="miMapa" CredentialsProvider="AwQh_41-o1y-
v1GpwaI3IG7ryv7eAlbWjsZFxJbYJVr_7GzHg2Rze"></map:Map>
11. Control BingMaps
Cambiar el tipo de vista:
miMapa.Mode = new RoadMode();
miMapa.Mode = new AerialMode();
Cambiar el zoom:
if (miMapa.ZoomLevel < 20)
miMapa.ZoomLevel++;
if (miMapa.ZoomLevel > 1)
miMapa.ZoomLevel--;
Añadir Pushpin:
Pushpin pin = new Pushpin();
pin.Content = "Aquí";
pin.Background = new SolidColorBrush(Colors.Orange);
pin.Location = coord;
miMapa.SetView(coord, 14);//indico las coordenadas y el zoom
miMapa.Children.Add(pin);
13. Recursos
Centro de desarrollo de WP7 en MSDN
http://msdn.microsoft.com/es-es/windowsphone/default.aspx
AppHub
http://create.msdn.com/
Windows Phone Developer Blog
http://windowsteamblog.com/windows_phone/b/wpdev
MobileNUG
http://www.mobilenug.es
Forums
http://forums.create.msdn.com/forums/