You are on page 1of 47

M14: Location and Maps

Andy Wigley | Microsoft Technical Evangelist Rob Tiffany | Microsoft Enterprise Mobility Strategist

Target Agenda | Day 1


Module and Topic | 10-minute breaks after each session / 60-minute meal break 1a - Introducing Windows Phone 8 Application Development | Part 1 1b - Introducing Windows Phone 8 Application Development | Part 2 2 - Designing Windows Phone Apps Planned Duration 50:00 50:00 50:00

3 - Building Windows Phone Apps


4 - Files and Storage on Windows Phone 8 Meal Break | 60-minutes 5 - Windows Phone 8 Application Lifecycle 6 - Background Agents 7 - Tiles and Lock Screen Notifications 8 - Push Notifications

50:00
50:00 60:00 50:00 25:00 25:00 30:00

9 - Using Phone Resources on Windows Phone 8

50:00

Target Agenda | Day 2


Module and Topic | 10-minute breaks after each session / 60-minute meal break 10 - App to App Communication 11 - Network Communication on Windows Phone 8 12 - Proximity Sensors and Bluetooth Planned Duration 35:00 50:00 35:00

13 - Speech Input on Windows Phone 8


14 - Maps and Location on Windows Phone 8 15 - Wallet Support 16 - In App Purchasing Meal Break | 60-minutes 17 - The Windows Phone Store 18 - Enterprise Applications in Windows Phone 8: Architecture and Publishing

35:00
35:00 25:00 25:00 60:00 50:00 50:00

19 - Windows 8 and Windows Phone 8 Cross Platform Development


20 Mobile Web

50:00
50:00

Module Agenda

Introducing the new Location API and the new Maps Controls Windows Phone Runtime Location API How to Get the Phones Current Location How to Continuously Track the Phones Location How to Run Location-Tracking Apps in the Background Getting Started with the New Map Control Specifying Map Center and Zoom Animating Map Display Using Map Views

Windows Phone Runtime Location API

Microsoft

12/4/20

Location APIs on Windows Phone 8


.NET Location API from Windows Phone OS 7.1 is still supported

System.Device.Location.GeoCoordinateWatcher and related classes


New Windows Phone Runtime location API Accessible from managed and native code

Improved ability for one-shot location acquisition


Improved capabilities for location tracking Convergent with Windows 8 location API

ID_CAP_LOCATION Capability
You must include the ID_CAP_LOCATION capability in your app manifest

If you forget, calls to location APIs throw an UnauthorizedAccessException

Location Sources GPS: +Accuracy, -Power, -Speed, -Indoors Cell Towers: -Accuracy, +Power, +Speed, -Wilderness WiFi: +/- Accuracy, +/- Power, +/- Speed, +/- Urban Areas

Controlling the Sources the Geolocation Service Uses


You cant!

You can set the DesiredAccuracy property of the Geolocator object:


PositionAccuracy.High if you want the most accurate data available, but at the cost of increased battery usage, network bandwidth and possibly monetary charges from

wireless network operators. Often this causes the GPS to be activated


PositionAccuracy.Default to optimize for power You can also set the DesiredAccuracyInMeters property to indicate to the Geolocation

service the desired accuracy of any results


However, the Geolocation service determines the best location data to provide to the application

How to Get the Phones Current Location


private async void OneShotLocation_Click(object sender, RoutedEventArgs e)

{
Geolocator geolocator = new Geolocator(); geolocator.DesiredAccuracyInMeters = 50; try { Geoposition geoposition = await geolocator.GetGeopositionAsync( maximumAge: TimeSpan.FromMinutes(5), timeout: TimeSpan.FromSeconds(10) ); LatitudeTextBlock.Text = geoposition.Coordinate.Latitude.ToString("0.00");

LongitudeTextBlock.Text = geoposition.Coordinate.Longitude.ToString("0.00");
} catch (UnauthorizedAccessException) { // the app does not have the right capability or the location master switch is off StatusTextBlock.Text = "location } } is disabled in phone settings.";

User Consent
Application certification requirements on user consent still the same as in 7.1

If you are using location data just within your app, you do not need to ask explicitly for
user consent (although they give consent when they install your app) You only have to get user consent if you plan to make location data available to any other

service or other person:


2.7.4 If your application publishes or makes available location data obtained from the

Location Service API to any other service or other person (including advertising networks),
your application must implement a method to obtain opt-in consent.

Location on Emulator
Windows Phone Emulator comes with Location simulator

Demo 1

Get Phone Position and Location Emulator

Location Tracking
If your app only needs the users location at the current time,

use GetGeopositionAsync as already described


Continuously tracking the users location drains the users battery more and should only be used for apps that require it

How to Track Location


private void TrackLocation_Click(object sender, RoutedEventArgs e) { if (!tracking) { geolocator = new Geolocator(); geolocator.DesiredAccuracy = PositionAccuracy.High; geolocator.MovementThreshold = 100; // The units are meters. geolocator.StatusChanged += geolocator_StatusChanged; geolocator.PositionChanged += geolocator_PositionChanged; tracking = true; } else { geolocator.PositionChanged -= geolocator_PositionChanged; geolocator.StatusChanged -= geolocator_StatusChanged; geolocator = null; tracking = false; } }

Geolocator Status
void geolocator_StatusChanged(Geolocator sender, StatusChangedEventArgs args) { string status = ""; switch (args.Status) { case PositionStatus.Disabled: // the application does not have the right capability or the location master switch is off status = "location is disabled in phone settings"; break; case PositionStatus.Initializing: // the geolocator started the tracking operation status = "initializing"; break; case PositionStatus.NoData: // the location service was not able to acquire the location status = "no data"; break;

Geolocator Status
void geolocator_StatusChanged(Geolocator sender, StatusChangedEventArgs args) { string status = ""; switch (args.Status) { case PositionStatus.Disabled: // the application does not have the right capability or the location master switch is off status = "location is disabled in phone settings"; break; case PositionStatus.Initializing: // the geolocator started the tracking operation status = "initializing"; break; case PositionStatus.NoData: // the location service was not able to acquire the location status = "no data"; break; case PositionStatus.Ready:

Position Changed

void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args) { Dispatcher.BeginInvoke(() => {

LatitudeTextBlock.Text = args.Position.Coordinate.Latitude.ToString("0.00"); LongitudeTextBlock.Text = args.Position.Coordinate.Longitude.ToString("0.00");


}); }

Demo 2 Tracking Phone Position

Enable Location Tracking in the Background


Normally, when your user navigates away from your app, it is made dormant and all

activity including location tracking is suspended


In Windows Phone 8, a location-tracking app can continue to run in the background after the user navigates away, as long as the app continues to actively track location

This feature enables scenarios such as an app that provides turn-by-turn directions or a
run tracker

Enable Background Execution


Edit WMAppManifest.xml using the XML (Text) Editor Replace <DefaultTask> element as shown

Register Event Handler for RunningInBackground Event


In App.Xaml, register an event handler for the RunningInBackground event
This event is raised when the user navigates away from your background execution-enabled app while you are actively tracking location When this event is raised, your app should stop all tasks that are not related to location tracking, including updates to the apps UI
<Application.ApplicationLifetimeObjects> <!--Required object that handles lifetime events for the application-->

<shell:PhoneApplicationService Launching="Application_Launching" Closing="Application_Closing Activated="Application_Activated" Deactivated="Application_Deactivated RunningInBackground="Application_RunningInBackground"/> </Application.ApplicationLifetimeObjects>

Implement RunningInBackground Event Handler


// Static variables global to application to support tracking public static Geolocator Geolocator { get; set; } public static bool RunningInBackground { get; set; }
// Code to execute when the application is activated (brought to foreground) private void Application_Activated(object sender, ActivatedEventArgs e) { RunningInBackground = false; } // Code to execute when the application is deactivated and is tracking location private void Application_RunningInBackground(object sender, RunningInBackgroundEventArgs e) { RunningInBackground = true;

// Suspend all unnecessary processing such as UI updates


}

Do Not Update UI When Running in the Background


Example void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args) { if (!App.RunningInBackground) { Dispatcher.BeginInvoke(() => {

LatitudeTextBlock.Text = args.Position.Coordinate.Latitude.ToString("0.00"); LongitudeTextBlock.Text = args.Position.Coordinate.Longitude.ToString("0.00"); });


} else { // DEMO purposes only: Show toast if running in background Microsoft.Phone.Shell.ShellToast toast = new Microsoft.Phone.Shell.ShellToast(); toast.Content = args.Position.Coordinate.Latitude.ToString("0.00"); toast.Title = "Location: "; toast.NavigationUri = new Uri("/Page2.xaml", UriKind.Relative);

toast.Show();
} }

Demo 3 Background Location Tracking

Maps

Maps APIs on Windows Phone 8


Windows Phone 8 has new Map controls, accessible in the

following namespaces:
Microsoft.Phone.Maps Microsoft.Phone.Maps.Controls Microsoft.Phone.Maps.Services The Bing Maps Control is still supported, but is deprecated You should only use the Bing Maps Control when you upgrade an app from Windows Phone OS 7.1 to Windows Phone 8 Usage of the new Maps control differs from the Bing Maps control

ID_CAP_MAP Capability
You must include the ID_CAP_MAP capability in your app manifest

If you forget, calls to location APIs throw an UnauthorizedAccessException

Map Control
Add a Map to your UI

In XAML:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <maps:Map x:Name="MyMap"/> </Grid>

In Code:
private void CreateMap() { Map MyMap = new Map(); ContentPanel.Children.Add(MyMap); }

Center and Zoom Level

By default, map displays at zoom level 1 (world view) and centered at Lat: 0, Long: 0 Use the Center and ZoomLevel properties to change this, in XAML or in code
//Set the Map center by using Center property MyMap.Center = new GeoCoordinate(47.6097, -122.3331); //Set the map zoom by using ZoomLevel property MyMap.ZoomLevel = 10;

MapViews
It is common to move a map display from one location to another

A new map view is defined any time the position of the map is changed as a result of panning, zooming, rotating, or tilting
You can use the SetView method to define a map view This takes the following parameters: Center: A GeoCoordiante object defining the center of the map view ZoomLevel: zoom level between 1 and 20 Heading: specifies the directional heading that is pointing up on the mapin geometric degrees between 0 and 360 Pitch: specifies the degree to which the map is tilted as a value between 0 and 180 BoundingRectangle: a LocationRectangle object that contains the Map control AnimationKind: sets the kind of animation you want to see (None, Linear or Parabolic) when the view changes

Cartographic Mode
Set the cartographic mode of the map with the CartographicMode property

Road (default)

Aerial

Hybrid

Terrain

Light and Dark Color Modes


You can display the map in a light or dark color mode by setting the ColorMode property

Light (default)

Dark

Pedestrian Features and Landmarks


You can display additional elements on your map, such as

landmarks and pedestrian features


Set the LandmarksEnabled property to true to display landmarks Set the PedestrianFeaturesEnabled to true to display pedestrian features Landmarks are visible only when the ZoomLevel is 7 or higher, and the Pitch property is 25 or higher

Demo 4 Maps Control

Pushpins
Unlike the Bing Maps API, the Windows Phone Maps API does not have a specific PushPin object

However, you can create your own PushPins by


drawing UIElements onto a MapOverlay, then add the MapOverlay to a MapLayer which you

add to the Map

Creating a Pushpin
private Grid CreatePushpin() { //Creating a Grid element. Grid MyGrid = new Grid();

MyGrid.RowDefinitions.Add(new RowDefinition()); MyGrid.RowDefinitions.Add(new RowDefinition()); MyGrid.Background = new SolidColorBrush(Colors.Transparent); //Creating a Rectangle Rectangle MyRectangle = new Rectangle(); MyRectangle.Fill = new SolidColorBrush(Colors.Black); MyRectangle.Height = 20; MyRectangle.Width = 20; MyRectangle.SetValue(Grid.RowProperty, 0); MyRectangle.SetValue(Grid.ColumnProperty, 0); //Adding the Rectangle to the Grid MyGrid.Children.Add(MyRectangle);

Creating a Pushpin
private Grid CreatePushpin() { //Creating a Grid element. Grid MyGrid = new Grid(); MyGrid.RowDefinitions.Add(new RowDefinition()); MyGrid.RowDefinitions.Add(new RowDefinition());

MyGrid.Background = new SolidColorBrush(Colors.Transparent); //Creating a Rectangle Rectangle MyRectangle = new Rectangle(); MyRectangle.Fill = new SolidColorBrush(Colors.Black); MyRectangle.Height = 20; MyRectangle.Width = 20; MyRectangle.SetValue(Grid.RowProperty, 0); MyRectangle.SetValue(Grid.ColumnProperty, 0); //Adding the Rectangle to the Grid MyGrid.Children.Add(MyRectangle);

Drawing a UIElement onto a MapLayer


private void AddMapOverlay()

{
Grid MyGrid = CreatePushpin(); //Creating a MapOverlay and adding the Grid to it. MapOverlay MyOverlay = new MapOverlay(); MyOverlay.Content = MyGrid; MyOverlay.GeoCoordinate = new GeoCoordinate(47.6097, -122.3331); MyOverlay.PositionOrigin = new Point(0, 0.5);

//Creating a MapLayer and adding the MapOverlay to it MapLayer MyLayer = new MapLayer(); MyLayer.Add(MyOverlay); MyMap.Layers.Add(MyLayer);
}

Demo 5 Pushpins

New Maps Launchers in Windows Phone 8.0

MapsTask
MapsTask makes launching the built-in Maps application easy

MapsTask mapsTask = new MapsTask(); //Omit the Center property to use the user's current location. mapsTask.Center = new GeoCoordinate(47.6204, -122.3493);

mapsTask.SearchTerm = "coffee"; mapsTask.ZoomLevel = 17;


mapsTask.Show();

MapsDirectionsTask
Launching built-in Maps tasks with directions enabled is trivial too!
// Get Directions MapsDirectionsTask mapsDirectionsTask = new MapsDirectionsTask(); // // // // You can specify a label and a geocoordinate for the end point. GeoCoordinate spaceNeedleLocation = new GeoCoordinate(47.6204,-122.3493); LabeledMapLocation spaceNdleLML = new LabeledMapLocation("Space Needle", spaceNeedleLocation);

// If you set the geocoordinate parameter to null, the label parameter // is used as a search term. LabeledMapLocation spaceNdleLML = new LabeledMapLocation("Space Needle", null); // If mapsDirectionsTask.Start is not set, the user's current location // is used as start point. mapsDirectionsTask.End = spaceNdleLML; mapsDirectionsTask.Show();

MapDownloaderTask

Use the map downloader task to enable users to download map data for offline use The task launches the Maps settings application which allows the user to select a region of map data to download
MapDownloaderTask mapDownloaderTask = new MapDownloaderTask(); mapDownloaderTask.Show();

MapUpdaterTask

Use the map updater task to enable users to update map data they have previously downloaded for offline use The task launches the Maps settings application which immediately checks to see if there are updates available for any previously downloaded map data
MapUpdaterTask mapUpdaterTask = new MapUpdaterTask(); mapUpdaterTask.Show();

Review
Windows Phone Runtime location API is new in Windows Phone 8. It has the following

features:
Accessible from managed and native code Greater support for one-shot location acquisition Support for Background Location Tracking Convergent with Windows 8 Use the new Maps APIs in Windows Phone 8 to develop maps-based apps, and incorporate location and search features Set Center and Zoom Level Animate to new location and zoom using map views Select Road, Aerial, Hybrid or Terrain cartographic display modes

Draw UIElements onto a MapOverlay on top of the Map

The information herein is for informational purposes only an represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be

interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation.

MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.

2012 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.

You might also like