导出 (0) 打印
全部展开
信息
您所需的主题如下所示。但此主题未包含在此库中。

如何持续跟踪 Windows Phone 8 手机的位置

2014/6/18

仅适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1

本主题演示了如何使用 Windows Phone 位置 API 持续跟踪手机的位置。如果您的应用仅需要用户当前的位置,例如要在某个位置登记用户或执行基于位置的搜索,您应该使用在如何在 Windows Phone 8 中获取手机的当前位置中描述的单次技术。与获取单个位置所消耗的电池电量相比,持续跟踪用户的位置消耗的电池电量更多,并且它应该仅用于需要使用该功能的应用。

重要说明重要说明:

若要在您的 Windows Phone 应用中使用位置 API,您必须在应用清单文件中包含 ID_CAP_LOCATION 功能。如果您未执行此操作,那么当您在开发期间部署应用时,应用将引发异常,并且会导致当您将应用提交到 Windows Phone 应用商店 时无法接收应用。有关更多信息,请参见 Windows Phone 8 应用功能和硬件要求

提示提示:

Windows Phone 8 和 Windows Phone 8.1 应用都支持 Windows 运行时 位置 API。本主题属于 Windows Phone 8 文档的一部分。若要查看此功能的 Windows Phone 8.1 文档(其中包括有关针对手机和电脑进行开发的信息),请参见检测地理位置

持续跟踪手机的位置

  1. 创建一个新 Windows Phone 应用。

  2. “解决方案资源管理器”中,展开“属性”文件夹,然后双击 WMAppManifest.xml。

  3. 在清单设计器的“功能”选项卡上,选中 ID_CAP_LOCATION 旁边的复选框。

  4. 在 MainPage.xaml 中,将以下 XAML 代码粘贴到现有的名为“ContentPanel”的 Grid 元素的上方。此代码将定义可启动位置 API 和某些文本块的按钮,以显示纬度、经度和应用的状态。

    
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel>
            <Button x:Name="TrackLocationButton" Click="TrackLocation_Click" Content="track location"/>
            <TextBlock x:Name="LatitudeTextBlock"/>
            <TextBlock x:Name="LongitudeTextBlock"/>
            <TextBlock x:Name="StatusTextBlock"/>
        </StackPanel>
    </Grid>
    
    
    
  5. 在 MainPage.xaml.cs 中,向文件的顶部添加以下 using 指令。

    
    using System.Threading.Tasks;
    using Windows.Devices.Geolocation;
    
    
    
  6. 在 MainPage 类定义中,为 Geolocator 对象声明某个变量并声明一个可跟踪应用是否正在主动跟踪位置的变量。

    
    Geolocator geolocator = null;
    bool tracking = false;
    
    
    
  7. 添加同意提示以允许用户取消允许应用访问他们的位置。所有应用必须在使用位置 API 之前获取用户同意。此示例将在 MainPage 类的 OnNavigatedTo(NavigationEventArgs) 方法(在应用启用时调用)中检查用户是否同意。代码首先在 ApplicationSettings 字典中查找“LocationConsent”键。如果已找到该键,这意味着用户已经加入或退出位置,因此该方法将立即返回。如果未找到该键,将显示 MessageBox 以请求用户同意。然后会检查 MessageBox 操作的结果,并且一个指示用户同意状态的布尔值将存储在 ApplicationSettings 的“LocationConsent”键中。在应用尝试访问用户的位置之前将检查此键。

  8. 将该按钮单击处理程序粘贴到 MainPage.xaml.cs 中。此处理程序可打开和关闭跟踪,但是它首先会检查 ApplicationSettings 字典中的“LocationConsent”值。如果应用以前未在跟踪位置,则将初始化 Geolocator 对象。然后,将设置精度和移动阈值。当手机移动的距离超过了先前位置的移动阈值时,将仅使用新的位置信息更新应用。接下来,将注册 StatusChangedPositionChanged 事件的事件处理程序。最后,tracking 变量将被设置为 true 并且将更新按钮文本。

    如果应用以前未在跟踪位置,则事件处理程序应关闭跟踪。若要执行此操作,请删除 StatusChangedPositionChanged 事件的事件处理程序并将 Geolocator 对象设置为 null。最后,将更新 tracking 变量和按钮文本。

    
    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;
            TrackLocationButton.Content = "stop tracking";
        }
        else
        {
            geolocator.PositionChanged -= geolocator_PositionChanged;
            geolocator.StatusChanged -= geolocator_StatusChanged;
            geolocator = null;
    
            tracking = false;
            TrackLocationButton.Content = "track location";
            StatusTextBlock.Text = "stopped";
        }
    }
    
    
    
  9. StatusChanged 事件的事件处理程序粘贴到 MainPage.xaml.cs 中。当定位服务的状态发生更改时将引发此事件。可以使用此方法向用户提供反馈。 由于此事件处理程序不是在 UI 线程上调用的,您必须使用 BeginInvoke(Action) 运行任何修改 UI 的代码。

    
    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 information
                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;
        });
    }
    
    
    
  10. PositionChanged 事件的事件处理程序粘贴到 MainPage.xaml.cs 中。每当手机移动的距离大于先前位置的移动阈值时都将引发此事件。同样,此事件处理程序不是在 UI 线程上调用的,因此您必须使用 BeginInvoke(Action) 运行任何修改 UI 的代码。

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

显示:
© 2015 Microsoft