此主题尚未评级 - 评价此主题

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

2013/12/5

适用于:仅限于 Windows Phone 8。

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

重要说明重要说明:

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

持续跟踪手机的位置

  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”密钥中。在应用尝试访问用户的位置之前将检查此密钥。

    
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        if (IsolatedStorageSettings.ApplicationSettings.Contains("LocationConsent"))
        {
            // User has opted in or out of Location
            return;
        }
        else
        {
            MessageBoxResult result = 
                MessageBox.Show("This app accesses your phone's location. Is that ok?", 
                "Location",
                MessageBoxButton.OKCancel);
    
            if (result == MessageBoxResult.OK)
            {
                IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = true;
            }else
            {
                IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = false;
            }
    
            IsolatedStorageSettings.ApplicationSettings.Save();
        }
    }
    
    
    
  8. 将按钮单击处理程序粘贴到 MainPage.xaml.cs 中。此处理程序可打开和关闭跟踪,但是它首先会检查 ApplicationSettings 字典中的“LocationConsent”值。在应用之前未启动跟踪的情况下,将初始化 Geolocator 对象。然后,将设置精度和移动阈值。当手机移动的距离超过了先前位置的移动阈值时,将仅使用新的位置信息更新应用。接下来,将注册 StatusChangedPositionChanged 事件处理程序。最后,tracking 变量将被设置为 true 并且将更新按钮文本。

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

    
    private void TrackLocation_Click(object sender, RoutedEventArgs e)
    {
        if ((bool)IsolatedStorageSettings.ApplicationSettings["LocationConsent"] != true)
        {
            // The user has opted out of Location.
            return;
        }
    
        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");
        });
    }
    
    
    

本文是否对您有所帮助?
(1500 个剩余字符)
感谢您的反馈
显示:
© 2014 Microsoft. 版权所有。