0

私は、定期的にユーザーの最後の場所を検出する必要があるアプリケーションに取り組んでいます。Google で見つけたいくつかのチュートリアルを使用しましたが、どれも機能せず、助けが必要です。これが私のコードのサンプルです。

app.xaml.cs 内に schdeuledactionservice を作成しました。そして、WMAppManifest.xml 内に拡張タスクを追加しました。

WMAppManifest.xml から

<ExtendedTask Name="BackgroundTask">
    <BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="ToDoSchedulerAgent" Source="ToDoSchedulerAgent" Type="ToDoSchedulerAgent.TaskScheduler" />
  </ExtendedTask>

スケジューラ エージェント コード:

public class TaskScheduler : ScheduledTaskAgent
{
    public const string Name = "ToDoLocator";
    public static Location location;
    protected override void OnInvoke(ScheduledTask task)
    {
        if (task is PeriodicTask)
        {
            GeoCoordinateWatcher watcher = new GeoCoordinateWatcher(GeoPositionAccuracy.High)
            {
                MovementThreshold = 10
            };

            watcher.PositionChanged += new EventHandler<GeoPositionChangedEventArgs<GeoCoordinate>>(watcher_PositionChanged);
            watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEventArgs>(watcher_StatusChanged);
            ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(3));
            watcher.Start();
        }
        NotifyComplete();
    }

    void watcher_StatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
    {
        throw new NotImplementedException();
    }

    void watcher_PositionChanged(object sender, GeoPositionChangedEventArgs<GeoCoordinate> e)
    {
        Deployment.Current.Dispatcher.BeginInvoke(() => PositionChanged(e));
    }

    void PositionChanged(GeoPositionChangedEventArgs<GeoCoordinate> e)
    {
        location = new Location();
        location.Latitude = e.Position.Location.Latitude;
        location.Longitude = e.Position.Location.Longitude;
    }
}
4

1 に答える 1

2

まず、「ScheduledActionService.LaunchForTest」は最終的なアプリでは使用しないでください。テスト専用です。
第二に、私はこのアプローチを使用し、それはうまく動作します - GeoCoordinateWatcher を開始し、初期化されるまで AutoResetEvent を使用して待機します。その後、座標を使用できます。

private void WatcherStatusChanged(object sender, GeoPositionStatusChangedEventArgs e)
{
    _status = e.Status;
    switch (e.Status)
    {
        case GeoPositionStatus.Disabled:
        case GeoPositionStatus.NoData:
        case GeoPositionStatus.Ready:
            _watcherLock.Set();
            break;
        case GeoPositionStatus.Initializing:
            break;
        default:
            throw new ArgumentOutOfRangeException();
    }
}

private readonly GeoCoordinateWatcher _watcher = new GeoCoordinateWatcher();
private readonly AutoResetEvent _watcherLock = new AutoResetEvent(false);
private GeoPositionStatus _status;

/// <summary>
/// Agent that runs a scheduled task
/// </summary>
protected override void OnInvoke(ScheduledTask scheduledTask)
{
    _watcher.StatusChanged += WatcherStatusChanged;
    _watcher.Start();

    // wait until watcher is initialized
    _watcherLock.WaitOne();

    // if GPS is disabled or have no data, just return
    if (_status == GeoPositionStatus.Disabled || _status == GeoPositionStatus.NoData)
    {
        NotifyComplete();
        return;
    }

    // get current position
    GeoCoordinate location = _watcher.Position.Location;

    ...

    NotifyComplete();
}
于 2012-11-18T14:40:00.403 に答える