使用Windows Phone定位服务(译文)
By S.F.
本文链接 https://www.kyfws.com/news/using-windows-phone-location-services/
版权声明 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
- 9 分钟阅读 - 4058 个词 阅读量 0使用Windows Phone定位服务(译文)
原文地址:https://www.codeproject.com/Articles/292144/Using-Windows-Phone-Location-Services
原文作者:Joel Ivory Johnson
译文由本站翻译
前言
快速撰写位置服务.
介绍
我在乔治亚理工大学校园的Microsoft活动中协助一些大学生.有关定位服务的一些问题出现了.几天后,我在Microsoft Windows Phone开发论坛中协助其他大学生,并且出现了一些相同的问题.因此,我决定对位置服务进行快速撰写,以在下次问题出现时作为参考.
我将介绍获取用户位置并将其格式化为屏幕所需的操作.
Windows Phone如何获取我的位置
Windows Phone使用三种技术来查找您的位置. GPS,基于WiFi的位置和基于Cell Tower的位置. GPS是最熟悉的技术.简而言之,GPS技术依赖于在轨卫星以及电话接收至少其中三颗卫星信号的能力.这些卫星都从同步时钟传输时间.但是由于卫星与电话的距离不同,因此从卫星接收的时间会略有不同(因为卫星与用户的距离越远,接收信号所花费的时间就越多).可以从这些时间差中计算出用户的位置. 基于Cell Tower的位置和基于WiFi的位置在工作方式上相似.当您使用其中任何一种时,手机都会尝试通过WiFi接入点和手机信号塔获取附近的标识符.标识符被发送到Microsoft服务,该服务保留其中看到过这些WiFi接入点或蜂窝塔的一般区域的记录,并将该信息返回给设备.这些信息不是静态的.可以拆除手机信号塔并建造新的信号塔,当人们搬到新公寓和住宅时,他们会随身携带接入点.为了使他们的信息保持最新状态,Microsoft作为[StreetSide Project]的一部分从行驶的车辆中获取新信息.(http://www.microsoft.com/maps/streetside.aspxhttp://www.microsoft.com/maps/streetside.aspx),并从其他使用定位服务的电话接收数据.如果电话能够从GPS获取位置并且还看到新的接入点,则该接入点将报告为已在该位置看到. 我有一个习惯,通常将任何类型的定位服务都称为GPS.这是不正确的,因为GPS是一种可能会或可能不会用于获取用户位置的定位技术. GPS也是利用美国发射的卫星的定位系统的名称.还有其他系统,例如GLONASS(Globalnaya navigatsionnaya sputnikovaya sistema),伽利略(Galileo)等(三星Focus S支持GPS和GLONASS).
精度或电池友好
这些定位技术中的每一种在其提供的位置准确性上都不同. GPS是最精确的,在有利的条件下,误差范围约为10米(32英尺).接下来最精确的定位技术是基于WiFi的定位. WiFi接入点传输的距离远不及手机发射塔.当您检测到一个时,您通常实际上就在它扔石头的距离之内.基于蜂窝塔的位置最不精确. 一般而言,更精确的定位技术(GPS)也对电池寿命产生更大的影响.当您需要获取位置信息时,可以指定低或高精度模式.为了保持用户的电池寿命,仅在需要时才需要高精度信息.如果您只需要一个常规位置,并且不希望用户在程序的会话期间到处走动,则最好在获取其位置后关闭位置服务.注意:如果需要用户的速度或海拔高度,则需要请求高精度位置. 有了用户的位置后,如果不需要继续检索更新的位置信息,则关闭位置监视程序.这样做将关闭与检索用户位置有关的无线电,并节省电池寿命.
取得检索位置的权限
在检索用户的位置之前,您需要具有权限.您需要在两个级别上检索位置;在设备级别和用户级别.在用户级别,只需询问用户权限以获取其位置即可.如果不是绝对需要精确的位置,那么您可能还希望为用户提供从城市列表中选择其位置的选项.您还将希望向用户显示隐私权通知,以便他或她知道如何使用他们的位置信息.在某些情况下,您不需要执行此操作,但是现在假设始终需要这样做.在没有获得许可的情况下检索用户位置并通过Internet传输是确保认证失败的可靠方法. 在设备级别,必须执行两项操作才能获得使用位置服务的许可.您需要确保您的应用程序已请求WMAppManifest.xml文件中的位置服务功能.为此,请确保在" “部分中具有” “行.否则,您的应用程序将无法使用位置服务.另请注意,此声明功能请求的存在也会使您的应用程序被列为需要在Marketplace中提供位置服务的应用程序. 即使您已请求定位服务功能,用户也可以完全禁用其手机上的定位服务.稍后我将讨论如何处理.
地点是什么
在[GeoCoordinate类]中返回位置信息(http://msdn.microsoft.com/zh-cn/library/system.device.location.geocoordinate.aspxhttp://msdn.microsoft.com/zh-cn/library/system.device.location.geocoordinate.aspx).让我们看一下类公开的属性 我首先列出了” IsUnknown",因为如果为true,则在查看其他字段时没有用.它们将不包含任何感兴趣的数据.我认为"纬度"和"经度"说明了自己. " HorizontalAccuracy"属性可以告诉您用户的实际坐标距离以米为单位,而" VerticalAccuracy"属性可以告诉用户高度距离以米为单位.居住在北美的人们将要注意,“海拔"和"速度"属性使用的是米和每秒米.此处未使用英制测量系统.如果您需要以英制单位显示某些内容,请记住先进行转换.
获取位置
让我们脱离讨论概念,并通过一些代码来检索用户的位置.要检索用户的位置,您需要创建一个地理坐标观察器,订阅一些事件,然后调用它的” Start()“方法.
private GeoCoordinateWatcher _watcher = null;
public GeoCoordinate MostRecentPosition { get; set; }
void StartWatcher()
{
if(_watcher == null)
{
_watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High);
_watcher.PositionChanged +=
new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);
_watcher.StatusChanged +=
new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged);
}
_watcher.Start();
if(_watcher.Permission == GeoPositionPermission.Denied)
{
//Location services is disable on the phone. Show a message to the user.
}
}
void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
MostRecentPosition = e.Position.Location;
}
void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
{
}
当手机具有更多更新的位置信息时,将触发” PositionChanged"事件.我将更新后的位置放置在名为" MostRecentPosition"的属性中,所有后续代码都将使用该属性中的值工作.要记住的一点是,定位服务在与UI线程不同的线程上运行.在许多基于Windows的技术(包括Windows Phone和Silverlight)中,您无法直接与seconday线程中的UI元素进行交互.如果要更新UI元素,则必须使用Dispatcher在UI线程上执行代码.
void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
{
MostRecentPosition = e.Position.Location;
this.Dispatcher.BeginInvoke(()=>
{
MyTextBox.Text = "Received a location!";
}
}
定位服务状态
地理坐标观察者可以在" GeoPositionStatus"枚举中定义各种状态.当状态改变时,将触发" StatusChanged"事件(也在辅助线程上). 在Mango(Windows Phone 7.1)之前,只有在程序开始运行之前就禁用了位置服务,人们才会期望状态为" Disabled".如果程序启动时可用,则您无需在程序使用期内再次检查它.在Mango位置服务可以随时禁用.在程序运行时,用户可以按"开始"按钮进入设置(在此过程中程序仍在后台运行),然后返回到程序(唤醒),并且定位服务将被禁用.
格式化位置数据
您所获取的" GeoCoordinate"对象上包含纬度和经度的成员的类型为" double".您可以使用与其他任何double类型相同的格式来格式化这些字段.例如,假设您要用小数点后三位数字显示位置.您可以执行以下操作.
string formatedLocation = String.Format("Lat/Long: {0:0.000},{1:0.000}",position.Latitude, position.Longitude);
显示这些数字的另一种方法是使用度,分和秒.您可能会猜到这些单位与您用来描述时钟时间的单位之间存在某种关系.地球每24小时旋转一次360度(实际上是每23小时56分钟旋转一次,但我不会详细说明这一点).将360除以24可得出地球在一小时内自转的量.它是15度.因此,当有人提到旋转一小时时,意味着旋转15度.一小时有60分钟.那么在一分钟内旋转多少度?这可以通过将15小时旋转小时数除以60得出0.25度来发现.要获得旋转一秒的度数,将0.25度除以60.给定旋转测量值,您可以使用以下步骤执行相同的步骤,将测量值转换为度,分,秒:
public static string DegreesToDegreesMinutesSecondsString(double source)
{
var d = Math.Floor(source);
var remainder = (source - d) * 60;
var m = Math.Floor(remainder);
remainder = (remainder - m) * 60;
var s = remainder;
return String.Format("{0:0}° {1:00}' {2:00}\"", d, m, s);
}
符合认证要求
使用定位服务时,必须做一些事情才能通过认证.最重要的是,您必须告知用户您打算如何使用他们的位置数据.如果位置数据永远不会离开设备,请告知用户.如果您需要使用其位置数据来调用公共Web服务,但又不打算传输标识信息,请告知用户. 您的程序还必须能够处理正常禁用位置服务的情况.根据您的程序的性质,您可以向用户提供城市列表,或者允许用户输入位置信息(例如邮政编码)以手动设置他们的位置.如果您的程序绝对必须具有位置服务信息(例如车速表应用程序),则让用户知道该程序需要位置服务才能进行操作.
范例程序
附加到此发布的应用程序检索位置信息,并将其显示在屏幕上.它还将允许您通过电子邮件将链接发送到您的位置,并向您展示如何将检索到的信息转换为每小时英尺和英里(对于使用英制系统的人)和每小时公里.该程序使用数据绑定在屏幕上显示信息,但是我没有太多使用转换器.由于信息也可以通过电子邮件发送,因此我会在代码内进行格式化,并将二者绑定到屏幕上并通过电子邮件发送.
要记住的事情
- WMAppManifest.xml
许可
本文以及所有相关的源代码和文件均已获得The Code Project Open License (CPOL)的许可。
C# Mobile Dev Intermediate Windows-Phone-7 新闻 翻译