2012-11-17 2 views
0

나는 정기적 인 시간에 사용자의 마지막 위치를 감지해야하는 응용 프로그램을 만들고 있습니다. 나는 구글에서 찾은 튜토리얼을 사용했지만 그 중 아무도 도움이 필요하지 않다. 여기 내 코드 샘플입니다.배경 에이전트, 마지막 사용자 위치 찾기

내 schdeuledactionservice는 app.xaml.cs. 파일 내에 만들었습니다. 그리고 WMAppManifest.xml 안에 확장 된 작업을 추가했습니다. WMAppManifest.xml

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

스케줄러 에이전트 코드에서

: 모든 "ScheduledActionService.LaunchForTest"최종 응용 프로그램에 사용하지 말아야의

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

답변

2

첫째, 그것은 단지 테스트 용입니다.
둘째, 나는이 방법을 사용하고 잘 작동합니다 - 나는하여 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(); 
} 
+0

내 또 다른 질문은 초기화하는 데 걸리는 시간입니다 이. 왜냐하면 아직도이 방법을 사용하여 프로그램 내 위치 값을 읽을 수 없기 때문입니다. –

+0

나는 1 초 이내에 값을 얻었다. 또한 앱 메인 페이지에 위치 기능을 추가 했습니까? –

+0

네이티브 맵 앱을 실행 한 후, 나는 지금 일하는 에이전트를 얻었지만 어쨌든 매 30 분마다 라이브 결과를 얻을 수 있습니까? –