windows phone 8 - 15 location and maps

49
Oliver Scheer Senior Technical Evangelist Microsoft Deutschland http://the-oliver.com Location and Maps

Upload: oliver-scheer

Post on 24-May-2015

323 views

Category:

Technology


2 download

TRANSCRIPT

Page 1: Windows Phone 8 - 15 Location and Maps

Oliver Scheer

Senior Technical Evangelist

Microsoft Deutschland

http://the-oliver.com

Location and Maps

Page 2: Windows Phone 8 - 15 Location and Maps

Agenda

Location and Maps on Windows Phone 8

Introducing the new Location API and the new Maps ControlsWindows Phone Runtime Location API

How to Get the Phone’s Current Location

How to Continuously Track the Phone’s 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

Page 3: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential3

Windows Phone Runtime Location API

Page 4: Windows Phone 8 - 15 Location and Maps

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

Page 5: Windows Phone 8 - 15 Location and Maps

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

04/12/20235

Page 6: Windows Phone 8 - 15 Location and Maps

Location Sources

Location

Services

+ Accuracy- Power- Speed- Indoors

- Accuracy+ Power+ Speed- Wilderness

+/- Accuracy+/- Power+/- Speed+/- Urban areas

GPS

Cell Towers

WiFi

Page 7: Windows Phone 8 - 15 Location and Maps

04/12/2023‹#›

• You can’t!

• 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

Controlling the Sources the Geolocation Service Uses

Page 8: Windows Phone 8 - 15 Location and Maps

How to Get the Phone’s 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.";

}

}

Page 9: Windows Phone 8 - 15 Location and Maps

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. …

04/12/20239

Page 10: Windows Phone 8 - 15 Location and Maps

10

• Windows Phone Emulator comes with Location simulator

Location on Emulator

Page 11: Windows Phone 8 - 15 Location and Maps

11

Demo 1

Get Phone Positionand Location Emulator

Page 12: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential12

• If your app only needs the user’s location at the

current time, use GetGeopositionAsync as

already described

• Continuously tracking the user’s location drains

the user’s battery more and should only be used

for apps that require it

Location Tracking

Page 13: Windows Phone 8 - 15 Location and Maps

04/12/2023

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;

}

}

How to Track Location

Page 14: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential14

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

Page 15: Windows Phone 8 - 15 Location and Maps

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:

// the location service is generating geopositions as specified by the tracking

parameters

status = "ready";

break;

case PositionStatus.NotAvailable:

status = "not available"; // not used in WindowsPhone, Windows desktop uses this

value to

// signal that there is no hardware capable to acquire

location

break;

case PositionStatus.NotInitialized:

// the initial state of the geolocator, once the tracking operation is stopped by the

// user the geolocator moves back to this state

break;

}

Dispatcher.BeginInvoke(() =>

{

StatusTextBlock.Text = status;

});

}

Geolocator Status

Page 16: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential16

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");

});

}

Position Changed

Page 17: Windows Phone 8 - 15 Location and Maps

17

Demo 2

Tracking Phone Position

Page 18: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential18

• 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 Location Tracking in the Background

Page 19: Windows Phone 8 - 15 Location and Maps

19

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

Enable Background Execution

Page 20: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential20

• 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 app’s 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>

Register Event Handler for RunningInBackground Event

Page 21: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential21

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

}

Implement RunningInBackground Event Handler

Page 22: Windows Phone 8 - 15 Location and Maps

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();

}

}

Do Not Update UI When Running in the BackgroundExample

Page 23: Windows Phone 8 - 15 Location and Maps

23

Demo 3

Background Location Tracking

Page 24: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential24

• As we have seen, Background Location Tracking apps continue to run in the

background• But if it is not actively tracking location when deactivated, it is made dormant as

normal• If the user launches *another* location tracking app and deactivates that, then your

app will be made dormant

• If the user launches a new instance of the app, if there is a dormant instance,

that is reactivated instead• Background Location Tracking apps get the Fast Application Resume behavior, which

reactivates a dormant application if the user launches a new copy• The dormant instance of the app, including the history of visited app pages, is

reactivated

• By default, the list of previously visited pages is cleared for these ‘Reset’

activations• This may not be what you want…

App Lifecycle for Background Location Tracking AppsFast Application Resume

Page 25: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential25

private void InitializePhoneApplication()

{

...

// Handle reset requests for clearing the backstack

RootFrame.Navigated += CheckForResetNavigation;

...

}

private void CheckForResetNavigation(object sender, NavigationEventArgs e)

{

// If the app has received a 'reset' navigation, then we need to check

// on the next navigation to see if the page stack should be reset

if (e.NavigationMode == NavigationMode.Reset)

RootFrame.Navigated += ClearBackStackAfterReset;

}

Clearing Previously Launched Pages on Fast App ResumeAdd Logic to App.Xaml.cs to Check for Reset Navigation (Behavior Already Implemented in Project

Templates)

Page 26: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential26

private void InitializePhoneApplication()

{

...

// Handle reset requests for clearing the backstack

RootFrame.Navigated += CheckForResetNavigation;

...

}

private void CheckForResetNavigation(object sender, NavigationEventArgs e)

{

// If the app has received a 'reset' navigation, then we need to check

// on the next navigation to see if the page stack should be reset

if (e.NavigationMode == NavigationMode.Reset)

RootFrame.Navigated += ClearBackStackAfterReset;

}

private void ClearBackStackAfterReset(object sender, NavigationEventArgs e)

{

// Unregister the event so it doesn't get called again

RootFrame.Navigated -= ClearBackStackAfterReset;

// Only clear the stack for 'new' (forward) and 'refresh' navigations

if (e.NavigationMode != NavigationMode.New && e.NavigationMode !=

NavigationMode.Refresh)

return;

// For UI consistency, clear the entire page stack

while (RootFrame.RemoveBackEntry() != null) { } // do nothing

}

Clearing Previously Launched Pages on Fast App ResumeAdd Logic to App.Xaml.cs to Check for Reset Navigation (Behavior Already Implemented in Project

Templates)

Page 27: Windows Phone 8 - 15 Location and Maps

Maps

Page 28: Windows Phone 8 - 15 Location and 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

Page 29: Windows Phone 8 - 15 Location and Maps

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

04/12/202329

Page 30: Windows Phone 8 - 15 Location and Maps

• 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);

}

Map Control

Page 31: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential31

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

Center and Zoom Level

Page 32: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential32

• 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

MapViews

Page 33: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential33

• Set the cartographic mode of the map with the CartographicMode property

Cartographic Mode

Road (default) Aerial Hybrid Terrain

Page 34: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential34

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

ColorMode property

Light and Dark Color Modes

Light (default) Dark

Page 35: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential35

• 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

Pedestrian Features and Landmarks

Page 36: Windows Phone 8 - 15 Location and Maps

36

Demo 4

Maps Control

Page 37: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential37

• 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

Pushpins

Page 38: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential38

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

Page 39: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential39

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 Polygon

Polygon MyPolygon = new Polygon();

MyPolygon.Points.Add(new Point(2, 0));

MyPolygon.Points.Add(new Point(22, 0));

MyPolygon.Points.Add(new Point(2, 40));

MyPolygon.Stroke = new SolidColorBrush(Colors.Black);

MyPolygon.Fill = new SolidColorBrush(Colors.Black);

MyPolygon.SetValue(Grid.RowProperty, 1);

MyPolygon.SetValue(Grid.ColumnProperty, 0);

//Adding the Polygon to the Grid

MyGrid.Children.Add(MyPolygon);

return MyGrid;

}

Creating a Pushpin

Page 40: Windows Phone 8 - 15 Location and Maps

04/12/2023Microsoft confidential40

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

}

Drawing a UIElement onto a MapLayer

Page 41: Windows Phone 8 - 15 Location and Maps

41

Demo 5

Pushpins

Page 42: Windows Phone 8 - 15 Location and Maps

New Maps Launchers in Windows Phone 8.0

Page 43: Windows Phone 8 - 15 Location and Maps

MapsTaskMapsTask 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();

Page 44: Windows Phone 8 - 15 Location and Maps

44

• Launching built-in Maps tasks with directions enabled is trivial too!

MapsDirectionsTask

// 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();

Page 45: Windows Phone 8 - 15 Location and Maps

• 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 mapDownloaderTask = new MapDownloaderTask();

mapDownloaderTask.Show();

Page 46: Windows Phone 8 - 15 Location and Maps

• 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 mapUpdaterTask = new MapUpdaterTask();

mapUpdaterTask.Show();

Page 47: Windows Phone 8 - 15 Location and Maps

47

Demo 6

MapsTask, MapsDirectionsTask, MapDownloaderTask, MapUpdaterTask

Page 48: Windows Phone 8 - 15 Location and Maps

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

Page 49: Windows Phone 8 - 15 Location and Maps

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.

© 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.

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